繁体   English   中英

有人可以解释为什么替换对我不起作用

[英]Can someone explain why replace isn't working for me

我需要删除句子中的多余空格。 这句话是"I like python" ,我需要打出"I like python" 所以我像这样使用replace:

>>>
>>> sentence="I  like   python"
>>> def checkio(element):
        newelement=element.replace("  ", " ") and element.replace("   ", " ")
        return newelement

>>> checkio(sentence)
'I  like python'
>>>

而且您会看到,即使我(认为)我告诉它用" "替换" " ,结果还是"I like python" " " 有人可以帮我弄清楚为什么这没用吗?

这可能是您想要做的:

def checkio(element):
    newelement = element.replace("  ", " ").replace("   ", " ")
    return newelement

您甚至可以将其缩短为

def checkio(element):
    return element.replace("  ", " ").replace("   ", " ")

但是,如果要替换任意数量的空格怎么办? 最好将句子拆分为任意数量的空格,然后将其与单个空格重新合并在一起。 为此,您将使用

def checkio(element):
    return " ".join(element.split())

split方法采用字符串并将其分成列表。 不带参数的话,它在空格之间分开:

>>> "I    like  python".split()
["I", "like", "python"]

join方法使用列表元素之间的字符串来获取列表并从中生成字符串:

>>> ' '.join(["I", "like", "python"])
"I like python"
>>> '__HELP__'.join(["I", "like", "python"])
"I__HELP__like__HELP__python"

为什么您的原始尝试失败了

线

newelement = element.replace("  ", " ") and element.replace("   ", " ")

没有按照您的期望进行操作,因为它使用的是字符串的“真实性”。 and运算符查看逻辑上的东西。 在python中,除""外的所有字符串都被视为True 您可以使用它来执行称为“短路”的操作。

当使用and ,left和right语句都必须为true才能使它的值为True 如果左侧部分为False ,则没有理由继续进行右侧部分,并且评估在那里停止(也称为“短路”)。 如果为true,则需要检查右侧以查看整个语句是否为true。 您可以利用此事实,如果为false则返回left语句,如果为true则返回right:

>>> a = "a" and "b"
>>> a
"b"
>>> a = "" and "b"
>>> a
""
>>> # It works oppositely with "or"
>>> a = "a" or "b"
>>> a
"a"
>>> a = "" or "b"
>>> a
"b"

element.replace(" ", " ")返回一个字符串, element.replace(" ", " ") 由于字符串的计算结果为True ,因此您基本上只会返回and的正确语句。

这在python中不是逻辑运算符的常见用法(尽管在其他语言中更常见)

如何使用它删除多余的空格:

" ".join(sentence.split())

如果需要,可以将其打包为一个函数:

def checkio(element):
    return " ".join(element.split())

您的方法失败的原因在and语句中。

Python首先评估element.replace(" ", " ") ,这给出了"I like python"True声明)。

由于这是真的,Python将继续执行下一条语句,并返回该值

下一条语句是element.replace(" ", " ") ,其本身的计算结果为"I like python"

最后,它将此值设置为newelement ,您的函数将返回该值

element.replace(...)不会修改element它只会返回字符串的修改版本

你可以用

element = element.replace('   ', ' ')
newelement = element.replace('  ', ' ')

虽然这不是一个很好的通用解决方案

str.split()将为您组合任意数量的空格,因此

newelement = ' '.join(element.split())

是完成此特定任务的最简单方法。 如果您必须删除多余的内容. "I..like...python" ,您将需要另一种方法

正如评论中提到的那样,我认为您对“和”的理解是错误的。

人们回避的实际原因是,第一条语句实际上距离每个实例2个空格,而第二条语句从不找到任何3个空格的段,而给您留下(“” ...“”)

因此2空间+ 3空间变成1空间+ 2空间。 (避免键入,因为此处很难查看空格)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM