【问题标题】:Removing all empty elements from a list [duplicate]从列表中删除所有空元素[重复]
【发布时间】:2016-11-14 21:37:19
【问题描述】:

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

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

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

print (templist)

输出:

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

【问题讨论】:

  • templist = [x for x in templist if x != '']templist = list(filter(None, templist))。如果您想改变原始列表,请分配给templist[:]
  • 问题被标记为重复,但你可以在这里找到我的答案(解释为什么你的代码不起作用):gist.github.com/ischurov/028f2636c97f1e1a83f04ff10332a04d

标签: python list python-3.x


【解决方案1】:

嗯,你总是可以这样做:

new_list = list(filter(None, templist))

【讨论】:

  • 返回<filter object at 0x7ff4fcdff6d8>
  • 这就是过滤器位于list() 中的原因。在 python 3 filter() 返回一个过滤器对象,而在 python 2 filter 返回一个列表。所以,在 python 3 你需要做list(filter())
【解决方案2】:

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

对此的“Pythonic”解决方案是使用列表推导:

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

这会就地从列表中删除项目。

【讨论】:

  • A) 这是一个骗局。 B)[item for item in templist if item] 就足够了。空字符串评估为 false。
  • @TemporalWolf: A) 一个副本是什么? B) 我不想假设应该删除诸如None、0 和其他评估为False 的项目。 OP 状态“空元素” - 0None 不是 empty
  • @TemporalWolf:哦,我明白了,这个问题是一个骗局,而不是这个答案。这个答案与那个问题中接受的答案不同(它提到了就地替换),虽然概念相同,但这个问题与空字符串有关,而不是空列表。
  • 还有其他更“准确”的questions,但它们的答案质量较差。仍然非常非常重复。
  • @TemporalWolf:OP 询问为什么他们的代码不起作用。另一个问题只是询问如何从列表中删除项目。所以有一个根本的区别,根本不是“非常非常重复”。该问题中的任何答案都没有说明原因。这是重复问题的更好示例:stackoverflow.com/questions/2896752/…
【解决方案3】:

为了指出您的错误,通过遍历列表的副本,即将您的 for 语句更改为:

for element in templist[:]:

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

更简洁,你可以使用filter

templist = list(filter(None, templist))

None 被提供给它时​​,它只返回为真的元素(空字符串评估为假)。

【讨论】:

    【解决方案4】:

    例如,您可以创建一个名为 wordGrabber 的新列表,而不是删除空白,您可以在新列表中填充内容

    templist = ['', 'hello', '', 'hi', 'mkay', '', '']
    
    for element in templist:
        if element != '':
            wordGrabber.append(element)
    
    print (wordGrabber)
    

    【讨论】:

    • 请在您的回答中查看how to format code。我已经编辑了您的答案,以便格式化代码。
    猜你喜欢
    • 1970-01-01
    • 2021-06-16
    • 1970-01-01
    • 2015-01-05
    • 2012-05-09
    • 1970-01-01
    • 1970-01-01
    • 2021-10-28
    • 2019-11-24
    相关资源
    最近更新 更多