从列表中删除不重复的字符

时间:2014-06-17 00:10:02

标签: python

我试图从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]。有人可以解释为什么会这样吗?

6 个答案:

答案 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]

不建议在迭代时删除项目

相关问题