如何删除Python列表中所有出现的相同元素?

Var*_*una 4 python list

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

>>> a = [-1, 1, 66.25, 333, 333, 1234.5]
Run Code Online (Sandbox Code Playgroud)

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

for num in a:
    if num == 333:
       a.remove(num)
Run Code Online (Sandbox Code Playgroud)

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

 >>> a
 [-1, 1, 66.25, 333, 1234.5]
Run Code Online (Sandbox Code Playgroud)

如何删除所有相同元素的出现?我希望能够指定我希望删除所有实例的元素,并使用相同的名称或其他名称获取新的列表

Ash*_*ary 6

在这里使用列表理解:

>>> a = [-1, 1, 66.25, 333, 333, 1234.5]
>>> [item for item in a if item != 333]
[-1, 1, 66.25, 1234.5]
Run Code Online (Sandbox Code Playgroud)

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

for num in a[:]:  #iterate over a shallow copy
    if num == 333:
       a.remove(num)
Run Code Online (Sandbox Code Playgroud)

要获取仅包含唯一项的列表,请使用以下集:

>>> 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]
Run Code Online (Sandbox Code Playgroud)

如果订单无关紧要:

>>> a = [-1, 1, 66.25, 333, 333, 1234.5]
>>> list(set(a))
[66.25, 1, 333, -1, 1234.5]
Run Code Online (Sandbox Code Playgroud)

  • @ inspectorG4dget`for _ in range(a.count(333)):a.remove(333)`稍微高效一点. (2认同)

ide*_*n42 6

由于您询问如何删除元素,我会将列表重新指定为切片.

>>> a = [-1, 1, 66.25, 333, 333, 1234.5]
>>> a[:] = [item for item in a if item != 333]
Run Code Online (Sandbox Code Playgroud)

这将在内存中创建一个新的列表,通常是可以接受的,但是如果你想在没有调用的情况下避免这种情况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]
Run Code Online (Sandbox Code Playgroud)

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

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

  • @Lucas - 是的,它有所不同,因为问题要求从列表中删除,删除`[:]`将分配一个新变量,而不是就地修改列表,如果列表被引用,这是一个重要的区别别处. (3认同)

Aes*_*ete 5

我想你想要的是这样的

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

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

  • 但OP在他们的代码中明确使用了:“if num == 333”。我会使用 itertools 中的 set 或 uniqueverseen 配方而不是“collections.Counter”,因为这也会保留顺序。 (4认同)
  • 您可以看到问题的最后一行:“如何删除同一元素的所有出现?” (2认同)