从列表中删除所有空元素

Clo*_*one 1 python list python-3.x

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

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

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

print (templist)
Run Code Online (Sandbox Code Playgroud)

输出:

['hello', 'hi', 'mkay', '']
Run Code Online (Sandbox Code Playgroud)

Ell*_*rts 10

好吧,你总是可以这样做:

new_list = list(filter(None, templist))
Run Code Online (Sandbox Code Playgroud)

  • 这就是过滤器位于“list()”内的原因。在python 3中filter()返回一个过滤器对象,而在python 2中filter返回一个列表。所以,在 python 3 中你需要做 `list(filter())` (2认同)

mha*_*wke 9

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

对此的"Pythonic"解决方案是使用列表理解:

templist = ['', 'hello', '', 'hi', 'mkay', '', '']
templist[:] = [item for item in templist if item != '']
Run Code Online (Sandbox Code Playgroud)

这将执行到位去除列表项.

  • A)这是一个骗局。B) `[item for item in templist if item]` 就足够了。空字符串的计算结果为 false。 (3认同)
  • @TemporalWolf:A)一个什么的副本?B)我不想假设应该删除诸如"None",0和其他评估为"False"的项目.OP表示"空元素" - "0"和"无"不是_empty_. (2认同)
  • @TemporalWolf:OP 问_为什么_他们的代码不起作用。另一个问题只是问如何从列表中删除项目。这是根本性的区别,所以根本不是“非常非常重复”。该问题中的所有答案都没有解决原因。这是重复问题的更好示例:http://stackoverflow.com/questions/2896752/removing-item-from-list-during-iteration-whats-wrong-with-this-idiom (2认同)

Jim*_*ard 6

要指出您的错误,请迭代列表的副本,即将您的for语句更改为:

for element in templist[:]:
Run Code Online (Sandbox Code Playgroud)

在迭代列表时更改列表会导致您看到奇怪的结果。

更紧凑的是,您可以使用filter以下方法:

templist = list(filter(None, templist))
Run Code Online (Sandbox Code Playgroud)

None提供给它时​​,它只是返回 true 元素(空字符串评估为 false)。