仅保留列表中唯一项目的最有效方法?

时间:2012-03-11 20:31:24

标签: python performance list

所以我对Python比较陌生,试图找出在列表中只保留唯一项目的最佳方法。我目前的实现涉及计数器,字典和列表推导,但我不确定什么可能更快。

这是我尝试过的一个例子:

l = ['a', 'b', 'a']
d = dict(Counter(l))
[key for key, val in d.items() if val == 1]
>>> ['b']

此外,这仅适用于字符串而不是整数,我不知道为什么。

5 个答案:

答案 0 :(得分:5)

你只想要一次存在的东西吗?

>>> c=Counter(['a','b','a'])
>>> [n for n in c if c[n]==1]
['b']
>>> c=Counter([1,2,3,2,3,4,5,6,5,6])
>>> [n for n in c if c[n]==1]
[1, 4]

或者只列出一些独特的东西?

>>> set([1,2,3,2,3,4,5,6,5,6])
set([1, 2, 3, 4, 5, 6])

答案 1 :(得分:4)

Python有一个内置类型,用于确保列表中的成员是唯一的,它是set。使用您的示例:

l = ['a', 'b', 'a']
set(l)
>>> ['a','b']

通常,您可以通过从列表转换为集合并再次返回来从列表中“清洗”重复成员。例如:

l = ['a', 'b', 'a']
list(set(l))
>>> ['a','b']

这会将列表重新变为可变(可编辑)列表,并确保性能和便利性的最佳组合。

答案 2 :(得分:1)

你做这件事的方式没有错。虽然这个词是超级愚蠢的。这非常有效,但只有在“密钥”都可以清洗时才能使用

[k for k,v in Counter(L).iteritems() if v==1]

答案 3 :(得分:0)

如果您要删除重复的项目,请使用set,然后将结果重新转换为列表:

ls = [1, 2, 3, 3, 3, 'a', 'b', 'b', 'c']
unique = list(set(ls))
# unique is ['a', 1, 2, 3, 'c', 'b']

请注意,此操作不会保留元素的顺序。

答案 4 :(得分:0)

如果您不关心订单,请使用set()。但是,以下内容将保留顺序:

l = ['a', 'b', 'c', 'a', 'c', 'd']

a = []
for item in l:
   if item not in a: a.append(item)

或仅保留唯一的项目:

l = [item for item in l if l.count(item) == 1]