过滤列表

时间:2009-10-20 18:12:40

标签: python list unique

我想过滤列表中的重复元素 例如

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

我只对以下内容感兴趣:

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

实现这一目标的有效方法是什么? 干杯

10 个答案:

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