2012-03-11 104 views
1

因此,我对Python比较陌生,试图找出只保留列表中唯一项目的最佳方法。我目前的实施涉及一个计数器,字典和列表解析,但我不知道什么可能会更快。在Python中只保留列表中唯一项目的最有效方法

这里是什么,我已经试过一个例子:

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

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

+4

的为'dict'调用是多余的,只会工作:一'Counter'对象有一个'items'方法。什么让你觉得它不适用于整数? – 2012-03-11 20:35:25

+2

为什么不是一个集合而是一个列表? – danihp 2012-03-11 20:35:49

+0

嗯只是试了一遍,不知道为什么它不适用于整数之前。哦,不知道Counter有一个物品的方法。而一套将保持不唯一的项目。换句话说,我不想在我的答案中使用'a'。 – Squazic 2012-03-11 20:51:13

回答

4

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

>>> 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]) 
4

Python有一个内置类型以确保列表中的成员是唯一的,这是一个set。使用你的例子:

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

通常情况下,你可以通过从列表中转换,一组,并再次“洗”从列表中重复成员。例如:

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

这将使列表返回到可变(可编辑)列表并确保性能和便利性的最佳组合。

+1

请注意,这不能保持顺序。 – orlp 2012-03-11 20:43:26

+0

这保留了不是唯一的元素。我不想在我的最终名单中找到'a'。 – Squazic 2012-03-11 20:49:15

0

如果要删除重复项,使用set,然后将结果再转换到一个列表:

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

注意,该操作将不保留元素的顺序。

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] 
1

没有错,你在做它的方式。虽然字典是过度的。这是很有效的,但如果把“钥匙”都是可哈希

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