我需要删除列表中的唯一元素,首先想到的是:
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]
请告诉我为什么?
答案 0 :(得分:0)
查看每次迭代:
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%的时间你在迭代时修改同一个列表,你会遇到问题。
答案 1 :(得分:0)
使用时
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]就会出现。