我需要删除列表的唯一元素,首先想到的是:
def cut_uniq(data):
for x in data:
if data.count(x) == 1:
data.remove(x)
print(data)
cut_uniq([1, 2, 3, 4, 5,])
返回
[2, 4]
请告诉我为什么?
我需要删除列表的唯一元素,首先想到的是:
def cut_uniq(data):
for x in data:
if data.count(x) == 1:
data.remove(x)
print(data)
cut_uniq([1, 2, 3, 4, 5,])
返回
[2, 4]
请告诉我为什么?
查看每次迭代:
i x data
0 1 [1,2,3,4,5]
1 3 [2,3,4,5]
2 5 [2,4,5]
[2,4]
您可以迭代与您正在修改的列表不同的列表。这将返回列表的副本
def cut_uniq(data):
return [x for x in data if data.count(x) > 1]
或更有效地
from collection import Counter
def cut_uniq(data):
return [x for x, count in Counter(data) if count > 1]
如果您确实想修改原始列表,而不是返回副本
def cut_uniq(data):
i = 0
while i < len(data):
if data.count(data[i]) == 1:
del data[i]
else:
i += 1
或者
from collections import Counter
def cut_uniq(data):
for x, count in Counter(data):
if count == 1:
data.remove(x)
95% 的时间你在迭代时修改同一个列表,你会遇到问题。
当你使用
for x in data:
它转化为
对于 [0,1,2,3,4] 中的 i:x = data[i]
所以在第一个循环中,i = 0 data[i]=1。你从数据中删除 1,数据是 [2,3,4,5]
在第二个循环中,i = 1,因为现在数据是 [2,3,4,5],data[i] = 3。所以 2 留在数据列表中并且从未被访问过。
与数字 4 相同。
因此,当您完成循环时,列表中的 [2,4] 被允许。