我试图从python中的列表中删除非重复字符。例如list = [1,1,2,3,3,3,5,6]应该返回[1,1,3,3]。 我最初的尝试是:
def tester(data):
for x in data:
if data.count(x) == 1:
data.remove(x)
return data
这适用于某些输入,但对于[1,2,3,4,5],它会返回[2,4]。有人可以解释为什么会这样吗?
答案 0 :(得分:4)
l=[1,1,2,3,3,3,5,6]
[x for x in l if l.count(x) > 1]
[1, 1, 3, 3, 3]
添加列表中至少出现两次的元素。
在您自己的代码中,您需要将行for x in data
更改为for x in data[:]:
使用data[:]
,您正在迭代copy
原始列表。
答案 1 :(得分:4)
有一个线性时间解决方案:
def tester(data):
cnt = {}
for e in data:
cnt[e] = cnt.get(e, 0) + 1
return [x for x in data if cnt[x] > 1]
答案 2 :(得分:3)
这是因为您在迭代时从列表中删除。相反,请考虑添加到新列表中。
如果您使用的是2.7或更高版本,也可以使用collections.Counter:
[a for a, b in collections.Counter(your_list).items() if b > 1]
答案 3 :(得分:1)
另一种线性解决方案。
>>> data = [1, 1, 2, 3, 3, 3, 5, 6]
>>> D = dict.fromkeys(data, 0)
>>> for item in data:
... D[item] += 1
...
>>> [item for item in data if D[item] > 1]
[1, 1, 3, 3, 3]
答案 4 :(得分:0)
在迭代同一个列表时,不应该从可变列表中删除项目。当你这样做时,解释器没有任何方法可以跟踪它在列表中的位置。
有关同一问题的另一个示例,请参阅this question,其中包含许多建议的替代方法。
答案 5 :(得分:0)
你可以使用列表理解,就像这样:
def tester(data):
return [x for x in data if data.count(x) != 1]
不建议在迭代时删除项目