如何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)
如何删除所有相同元素的出现?我希望能够指定我希望删除所有实例的元素,并使用相同的名称或其他名称获取新的列表
在这里使用列表理解:
>>> 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)
由于您询问如何删除元素,我会将列表重新指定为切片.
>>> 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来创建一个新列表.
我想你想要的是这样的
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)
这将从任何值的列表中删除元素,前提是它们出现多次。