有人可以解释为什么替换不适合我

时间:2013-07-11 01:56:57

标签: python replace

我需要在句子中删除多余的空格。句子是"I  like   python",我需要"I like python"。所以我用这样的替换:

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

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

你看,结果是"I  like python"即使我(想)我告诉它用"  "取代" "。有人可以为我解释为什么这不起作用吗?

4 个答案:

答案 0 :(得分:3)

这可能就是你想要做的事情:

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时,左右声明必须为true才能评估为True。如果左边部分是False,则没有理由继续向右移动并且评估在那里停止(也就是“短路”)。如果是,那么它需要检查右侧以查看整个陈述是否为真。如果为false,则可以利用此事实返回左语句,如果左为真,则可以使用右语:

>>> 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,因此您基本上只返回{​​{1}}的正确语句。

这不是python中逻辑运算符的常用用法(但它常用于其他语言)

答案 1 :(得分:2)

如何使用它删除额外的空格:

" ".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,函数返回

答案 2 :(得分:0)

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

您可以使用

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

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

str.split()会为您分组任意数量的空白,所以

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

是执行此特定任务的最简单方法。如果您必须从.中删除额外的"I..like...python",则需要采用其他方法

答案 3 :(得分:0)

正如评论中所提到的,我认为你理解“和”是错误的。

人们正在避免的实际原因是第一个语句实际上距离每个实例需要2个空格,而第二个语句永远不会找到任何3个间隔的段,只留下(“”。 ..“”)

因此,2空格+3空间变为1空格+ 2空格。 (避免打字,因为这里很难看到空格)