【问题标题】:Removing every occurrence of some value from a Python list?从 Python 列表中删除每次出现的某个值?
【发布时间】:2011-04-11 06:28:29
【问题描述】:

这是我的代码:

a = [1,2,3,43,43,43]

count = a.count(43)
if count > 0:
    for i in range(count):
        a.remove(43)

print a

有没有更简单的方法来实现这一点?

【问题讨论】:

  • 这也不是一个很好的算法。每次您执行a.remove(43) 时,Python 都会再次从列表的开头开始,因此您正在一遍又一遍地测试值 [1,2,3]。在大 O 表示法中,这是 O(n^2)。下面使用简单列表理解的答案是 O(n)

标签: python list


【解决方案1】:

试试

a = [x for x in a if x != 43] 

【讨论】:

    【解决方案2】:

    试试itertools:

    >>> import itertools
    >>> a = [1, 2, 3, 43, 43, 45]
    >>> iter = itertools.ifilter(lambda x: x != 43, a)
    >>> list(iter)
    [1, 2, 3]
    

    【讨论】:

    • 通常列表推导和生成器表达式更好。
    • itertools 是在标准生成器工具之上构建的一组不错的工具。我认为它非常有用,但对于这个特定问题来说有点矫枉过正。
    【解决方案3】:

    请注意,上述所有解决方案(使用 remove 的解决方案除外,但执行时间非线性)将创建一个新列表,而不是原地修改原始列表。在您的情况下,这可能是也可能不是问题。如果要修改原始列表,则必须使用切片赋值,例如:

    a[:] = [value for value in a if value != 43] 
    

    【讨论】:

    • 为什么这里需要切片赋值?
    • 正如我在代码上方的评论中所说,如果您希望修改原始列表。如果列表作为参数传递给函数并且您希望函数具有修改调用者看到的列表的副作用,这可能很重要。
    【解决方案4】:

    您是否只想删除列表中的所有 43 a

    a = [x for x in a if x != 43]
    

    【讨论】:

    • 小错字?不应该是[x for x in a.. 而不是[a for x in a...
    猜你喜欢
    • 2019-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-08
    • 2014-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多