从列表中删除所有空元素

13

为什么我的代码没有删除列表中的最后一个空元素?

templist = ['', 'hello', '', 'hi', 'mkay', '', '']

for element in templist:
    if element == '':
        templist.remove(element)

print (templist)

输出:

['hello', 'hi', 'mkay', '']

2
templist = [x for x in templist if x != ''] 或者 templist = list(filter(None, templist))。如果您想要改变原始列表,请将其分配给 templist[:] - Steven Rumbalski
1
这个问题被标记为重复,但你可以在这里找到我的答案(附有为什么你的代码不起作用的解释):https://gist.github.com/ischurov/028f2636c97f1e1a83f04ff10332a04d - Ilya V. Schurov
4个回答

30

嗯,你可以总是这样做:

new_list = list(filter(None, templist))

1
这将返回 <filter object at 0x7ff4fcdff6d8> - Clone
2
这就是为什么filter在list()中。在Python 3中,filter()返回一个过滤器对象,而在Python 2中,filter返回一个列表。因此,在Python 3中,您需要执行list(filter()) - Henry C Wong

12

因为您正在改变被迭代的列表。可以将for循环想象成使用索引进行迭代; 删除元素会减少列表的长度,从而使索引> len(list)-1 无效。

这个问题的"Pythonic"解决方案是使用列表推导式:

templist = ['', 'hello', '', 'hi', 'mkay', '', '']
templist[:] = [item for item in templist if item != '']

这将对列表进行就地删除操作。


3
A) 这是一个重复的内容。 B) [item for item in templist if item] 足够了。空字符串会被视为假。 - TemporalWolf
3
@TemporalWolf:A)复制什么?B)我不想做出这样的假设,即应该删除诸如“None”、0和其他评估为“False”的项目。OP声明“空元素”-0None不是_空的_. - mhawke
1
@TemporalWolf:哦,我明白了,这个问题是一个重复的问题,而不是这个答案。这个答案与那个问题中被接受的答案不同(它提到了原地替换),虽然概念相同,但这个问题涉及空字符串,而不是空列表。 - mhawke
还有一些更“准确”的问题,但它们的答案质量更差。仍然非常非常重复。 - TemporalWolf
2
@TemporalWolf:OP问为什么他们的代码不起作用。而另一个问题仅仅是询问如何从列表中删除项目。因此有根本的区别,所以并不是“非常、非常重复”的问题。那个问题中没有一个答案解决了原因。这是一个更好的重复问题例子:https://dev59.com/wXE85IYBdhLWcg3wMQhm - mhawke
如果空格也应该被视为空的话,例如 " ",在 item != '' 后添加 and not item.isspace()。当字符串仅由空格(空白字符)组成时,str.isspace() 返回 True,但当字符串完全为空时不返回 True - j307

6
为了指出您的错误,可以通过迭代列表的副本来实现,即将您的for语句更改为:
for element in templist[:]:

在迭代列表时修改它会导致你看到的奇怪结果。

更紧凑的方式是,你可以使用filter

templist = list(filter(None, templist))

当给它传递None时,它只会返回那些为真的元素(空字符串被评估为假)。


2
你可以创建一个名为 wordGrabber 的新列表,然后不需要删除空格,而是将内容填充到你的新列表中。
templist = ['', 'hello', '', 'hi', 'mkay', '', '']

for element in templist:
    if element != '':
        wordGrabber.append(element)

print (wordGrabber)

1
请查看您回答中的代码格式,具体信息可参考如何格式化代码。我已经编辑了您的回答,使代码得以格式化。 - Steven Rumbalski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接