如何在Python中从列表中删除所有指定元素的实例?

25

假设我有一个列表 a

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

有没有一种函数可以删除所有的 [1, 1] 实例?

8个回答

53

如果您想就地修改列表,

a[:] = [x for x in a if x != [1, 1]]

4
为什么要设置 a[:] 而不是只有 a - Raj
1
@Raj:a = [1];b = a;a = [2];b == [1]a = [1];b = a;a[:] = [2];b == [2] - ephemient
7
@a不是一个你可以将物品放入的盒子 - 它是一个你可以绑在物品上的名牌。 a = ... 将名牌绑定到一个新对象上,但 a[:] 则用新列表的内容替换 a 绑定的列表中的所有项。 - wizzwizz4

25

使用列表推导式:

[x for x in a if x != [1, 1]]

2
我知道在这里写where很诱人,Ignacio,类比于SQL...但是它不起作用!你必须像我在答案中所做的那样拼写为if - Alex Martelli
@Alex:啊,是的,对了,已经修复了。 - Ignacio Vazquez-Abrams

9

谷歌找到了删除列表中所有项目,其中包括一些宝石般的内容。

from functools import partial
from operator import ne
a = filter(partial(ne, [1, 1]), a)

filter([1,1].__ne__, a) 有什么问题? - tzot
2
@ΤΖΩΤΖΙΟΥ 对于 list 是有效的,但在 Python 2.x 中 __ne__ 并不是 int 或某些其他类型的方法。这在 Python 3.x 中得到修复,但为了保持一致性... - ephemient

7
def remAll(L, item):
    answer = []
    for i in L:
        if i!=item:
            answer.append(i)
    return answer

虽然代码看起来比其他的长,但实际上它很干净、易读且高效。 - Walty Yeung

6

以下是对Alex Martelli答案的简单替代方案:

a = [x for x in a if x != [1,1]]

这个行为不同 - 它会设置变量的值,但不会修改对象。它似乎可以工作,但不会修改列表 - 而是替换它。使用旧列表的任何内容都不会得到更新。 - wizzwizz4

4
new_list = filter(lambda x: x != [1,1], a)

或者作为一个函数:

def remove_all(element, list):
    return filter(lambda x: x != element, list)

a = remove_all([1,1],a)

或更普遍的说:

def remove_all(elements, list):
    return filter(lambda x: x not in elements, list)

a = remove_all(([1,1],),a)

考虑到 list.remove 已经实现了相应的功能,我可能会将这个函数命名为 removeall - ephemient

1
filter([1,1].__ne__,a)

我更喜欢使用functools.partial(operator.ne,[1,1]),因为(至少在Python 2.x中)其他类型(例如int)并不都有__ne__。但是在Python 3中似乎已经修复了这个问题:所有类型都派生自object,而object确实有__ne__ - ephemient

-1

纯Python无模块版本,或无列表推导式版本(更易理解?)

>>> x = [1, 1, 1, 1, 1, 1, 2, 3, 2]
>>> for item in xrange(x.count(1)):
...     x.remove(1)
...
>>>
>>> x
[2, 3, 2]

也可以很容易地制作成一个def函数

def removeThis(li,this):
    for item in xrange(li.count(this)):
           li.remove(this)
    return li

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