2017-06-19 63 views
0

我遇到很多需要过滤python(2.7)列表以仅保留有序唯一值的任务。我的通常的方法是通过使用odereddict从集合:将Python列表转换为已排序的唯一值

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))] 
+0

这些信息对您有帮助吗? https://wiki.python.org/moin/HowTo/Sorting – Jaxi

+0

不,我不是在寻找''sort''选项 – Dimgold

+0

我要发布一个答案,但是这个线程被锁定,你有没有签出'deque '它的'O(1)'从任一端访问元素。 –

回答

-1

如果您需要t Ø保持摆脱重复的顺序,你可以不喜欢它:

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] 

这应该是大大比你的方法快。

3

你可以使用一个set这样的:

newls = [] 
seen = set() 

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

对不起,但它看起来比原来更复杂(for循环,两个额外的内存结构)。 – Dimgold

+1

没有必要设置 – Netwave

+1

@Dimgold:是的,它有点冗长,但它不需要任何'import's,并且可能比使用'OrderedDict.keys'更有效率吗? –

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] 
+0

相当肯定,这个算法至少是** O(n^2)**(不包括追加),而原来是** O(n)** – Dimgold

+0

@Dimgold ,实际上是** O(n * log(n))**我认为,但是你避免了创建3个中间结构。 – Netwave

+0

为什么登录?它没有排序。我试图找出瓶颈在哪里。我很肯定,从算法的角度来看 - @ eugene建议是效率最高的 – Dimgold

0

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

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

输出:

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

非常肯定,这个算法至少是** O(n^2)**(不包括追加),而原始的是** O(n)** – Dimgold

相关问题