4

如何333从下面的列表中删除两个出现?

>>> a = [-1, 1, 66.25, 333, 333, 1234.5]

我在 Python 2.7 命令行中输入了以下脚本

for num in a:
    if num == 333:
       a.remove(num)

333但只删除了第一次出现的

 >>> a
 [-1, 1, 66.25, 333, 1234.5]

如何删除相同元素的所有出现?我希望能够指定我希望删除所有出现的元素并获得一个具有相同名称或其他名称的新列表

4

4 回答 4

7

在此处使用列表推导:

>>> a = [-1, 1, 66.25, 333, 333, 1234.5]
>>> [item for item in a if item != 333]
[-1, 1, 66.25, 1234.5]

您的方法不起作用,因为您在迭代列表时正在修改列表

for num in a[:]:  #iterate over a shallow copy
    if num == 333:
       a.remove(num)

要获取唯一项目的列表,请使用集合:

>>> seen = set()
>>> a = [-1, 1, 66.25, 333, 333, 1234.5]
>>> [item for item in a if item not in seen and not seen.add(item)]
[-1, 1, 66.25, 333, 1234.5]

如果顺序无关紧要:

>>> a = [-1, 1, 66.25, 333, 333, 1234.5]
>>> list(set(a))
[66.25, 1, 333, -1, 1234.5]
于 2013-09-05T06:14:41.787 回答
6

既然您问如何删除元素,我会将列表重新分配为切片。

>>> a = [-1, 1, 66.25, 333, 333, 1234.5]
>>> a[:] = [item for item in a if item != 333]

这将在内存中创建一个新列表,通常这是可以接受的,但如果您想在不调用的情况下避免这种情况remove,它将多次检查相同的项目。

>>> a = [-1, 1, 66.25, 333, 333, 1234.5]
>>> for i in range(len(a) - 1, -1, -1):  # iterate over reversed indices's
>>>     if a[i] == 333:
>>>         del a[i]

这样做的好处是它首先删除了最后的项目(这在 CPython 中更快)。

请注意,在 Python 中从列表的开头-中间删除项目并不是那么理想。无论您使用哪种方法(del list[index]list.remove),如果列表很大并且必须删除许多项目,这意味着 Python 需要大量调整列表的大小,在这种情况下,我建议使用 list-comprehension 创建一个新列表。

于 2013-09-05T06:25:25.997 回答
4

我想你在这里想要的是这样的

a = [-1, 1, 66.25, 333, 333, 1234.5]
a = [el for el, count in collections.Counter(a).items() if count == 1]

这将从任何值的列表中删除元素,前提是它们多次出现。

于 2013-09-05T06:26:27.950 回答
0

在以下代码中,从 [5,3,4,7,8,4] 列表中删除了 4 个数字

>>> def pp(x):
...     if x==4:
...             return False
...     else:
...             return True
... 
>>> filter(pp, [5,3,4,7,8,4])

输出

[5, 3, 7, 8]
于 2013-09-05T06:58:48.527 回答