2

我需要删除句子中的多余空格。这句话是"I  like   python"and I need to make "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

4 回答 4

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,left 和 right 语句都必须为 true 才能对其求值True。如果左侧部分是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,因此您基本上只返回 . 的正确语句and

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

于 2013-07-11T02:01:37.970 回答
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,您的函数将返回

于 2013-07-11T02:00:13.810 回答
1

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

人们避免的实际原因是第一个语句实际上从每个实例中占用了 2 个空格,而第二个语句从未找到任何 3 个空格的段,只剩下 (" "... " ")

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

于 2013-07-11T02:07:27.107 回答
0

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

你可以使用

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

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

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

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

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

于 2013-07-11T02:01:22.480 回答