因此,我对Python比较陌生,试图找出只保留列表中唯一项目的最佳方法。我目前的实施涉及一个计数器,字典和列表解析,但我不知道什么可能会更快。在Python中只保留列表中唯一项目的最有效方法
这里是什么,我已经试过一个例子:
l = ['a', 'b', 'a']
d = dict(Counter(l))
[key for key, val in d.items() if val == 1]
>>> ['b']
而且,这只适用于字符串,而不是整数,我不知道为什么。
因此,我对Python比较陌生,试图找出只保留列表中唯一项目的最佳方法。我目前的实施涉及一个计数器,字典和列表解析,但我不知道什么可能会更快。在Python中只保留列表中唯一项目的最有效方法
这里是什么,我已经试过一个例子:
l = ['a', 'b', 'a']
d = dict(Counter(l))
[key for key, val in d.items() if val == 1]
>>> ['b']
而且,这只适用于字符串,而不是整数,我不知道为什么。
你想只存在一次的东西吗?
>>> 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])
Python有一个内置类型以确保列表中的成员是唯一的,这是一个set。使用你的例子:
l = ['a', 'b', 'a']
set(l)
>>> ['a','b']
通常情况下,你可以通过从列表中转换,一组,并再次“洗”从列表中重复成员。例如:
l = ['a', 'b', 'a']
list(set(l))
>>> ['a','b']
这将使列表返回到可变(可编辑)列表并确保性能和便利性的最佳组合。
如果要删除重复项,使用set,然后将结果再转换到一个列表:
ls = [1, 2, 3, 3, 3, 'a', 'b', 'b', 'c']
unique = list(set(ls))
# unique is ['a', 1, 2, 3, 'c', 'b']
注意,该操作将不保留元素的顺序。
如果您不关心订单,只需使用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]
没有错,你在做它的方式。虽然字典是过度的。这是很有效的,但如果把“钥匙”都是可哈希
[k for k,v in Counter(L).iteritems() if v==1]
的为'dict'调用是多余的,只会工作:一'Counter'对象有一个'items'方法。什么让你觉得它不适用于整数? – 2012-03-11 20:35:25
为什么不是一个集合而是一个列表? – danihp 2012-03-11 20:35:49
嗯只是试了一遍,不知道为什么它不适用于整数之前。哦,不知道Counter有一个物品的方法。而一套将保持不唯一的项目。换句话说,我不想在我的答案中使用'a'。 – Squazic 2012-03-11 20:51:13