我想过滤列表中的重复元素 例如
foo = ['a','b','c','a','b','d','a','d']
我只对以下内容感兴趣:
['a','b','c','d']
实现这一目标的有效方法是什么? 干杯
答案 0 :(得分:21)
list(
set
(foo))
如果您使用的是Python 2.5或更高版本,但不能保持顺序。
答案 1 :(得分:12)
如果您不关心元素顺序,请将foo转换为set。
答案 2 :(得分:5)
由于没有列表理解的订单保留答案,我提出以下建议:
>>> temp = set()
>>> [c for c in foo if c not in temp and (temp.add(c) or True)]
['a', 'b', 'c', 'd']
也可以写成
>>> temp = set()
>>> filter(lambda c: c not in temp and (temp.add(c) or True), foo)
['a', 'b', 'c', 'd']
根据foo
中的元素数量,您可以通过重复哈希查找获得更快的结果,而不是通过临时列表重复迭代搜索。
c not in temp
验证temp
没有商品c
;当项目添加到集合时,or True
部分强制c
将被发送到输出列表。
答案 3 :(得分:3)
>>> bar = []
>>> for i in foo:
if i not in bar:
bar.append(i)
>>> bar
['a', 'b', 'c', 'd']
这将是从列表中删除重复项并尽可能保留顺序的最直接的方法(尽管这里的“顺序”本质上是错误的概念)。
答案 4 :(得分:2)
如果您关心订单,可读方式如下
def filter_unique(a_list):
characters = set()
result = []
for c in a_list:
if not c in characters:
characters.add(c)
result.append(c)
return result
根据您对速度,维护性,空间消耗的要求,您可以找到上述不合适的产品。在这种情况下,请指定您的要求,我们可以尝试做得更好: - )
答案 5 :(得分:2)
如果你写一个函数来做这个我会使用一个生成器,它只是想在这种情况下使用。
def unique(iterable): yielded = set() for item in iterable: if item not in yielded: yield item yielded.add(item)
答案 6 :(得分:1)
受Francesco's answer的启发,而不是制作我们自己的filter()
类型函数,让我们让内置函数为我们做一些工作:
def unique(a, s=set()):
if a not in s:
s.add(a)
return True
return False
用法:
uniq = filter(unique, orig)
这可能会或可能不会比在纯Python中实现所有工作的答案更快或更慢。基准并看到。当然,这仅适用一次,但它证明了这一概念。当然,理想的解决方案是使用类:
class Unique(set):
def __call__(self, a):
if a not in self:
self.add(a)
return True
return False
现在我们可以根据需要使用它:
uniq = filter(Unique(), orig)
再一次,我们可能(或可能不会)将性能抛到窗外 - 使用内置函数的收益可能会被类的开销所抵消。我只是觉得这是一个有趣的想法。
答案 7 :(得分:1)
如果你最后需要一个排序列表,这就是你想要的:
>>> foo = ['a','b','c','a','b','d','a','d']
>>> bar = sorted(set(foo))
>>> bar
['a', 'b', 'c', 'd']
答案 8 :(得分:0)
import numpy as np
np.unique(foo)
答案 9 :(得分:0)
你可以做一些丑陋的列表理解黑客。
[l[i] for i in range(len(l)) if l.index(l[i]) == i]