将Python列表转换为有序的唯一值

时间:2017-06-19 10:31:03

标签: python python-2.7 list ordereddictionary

我遇到许多任务,我需要过滤python(2.7)列表以保留仅有序的唯一值。我通常的方法是使用集合中的odereddict

from collections import OrderedDict

ls = [1,2,3,4,1,23,4,12,3,41]

ls = OrderedDict(zip(ls,['']*len(ls))).keys()

print ls

输出是:

  

[1,2,3,4,23,12,41]

在Python中有没有其他最先进的方法呢?

  • 注意 - 输入和输出应以list
  • 的形式给出

编辑 - 可以在此处找到方法的比较: https://www.peterbe.com/plog/uniqifiers-benchmark

同时最好的解决方案是:

def get_unique(seq):
    seen = set()
    seen_add = seen.add
    return [x for x in seq if not (x in seen or seen_add(x))]

4 个答案:

答案 0 :(得分:3)

您可以像这样使用set

newls = []
seen = set()

for elem in ls:
    if not elem in seen:
        newls.append(elem)
        seen.add(elem)

答案 1 :(得分:0)

如果您需要保留订单删除重复项,您可以这样做:

ls = [1, 2, 3, 4, 1, 23, 4, 12, 3, 41]

lookup = set()  # a temporary lookup set
ls = [x for x in ls if x not in lookup and lookup.add(x) is None]
# [1, 2, 3, 4, 23, 12, 41]

这比你的方法相当快。

答案 2 :(得分:0)

定义一个函数来执行此操作:

def uniques(l):
    retl = []
    for x in l:
        if x not in retl:
            retl.append(x)
    return retl
ls = [1,2,3,4,1,23,4,12,3,41]
uniques(ls)
[1, 2, 3, 4, 23, 12, 41]

答案 3 :(得分:0)

另一种解决方案是使用这样的列表理解:

[x for i, x in enumerate(ls) if x not in ls[:i]]

输出:

[1, 2, 3, 4, 23, 12, 41]