2009-01-26 56 views
70

给定一个字符串列表,我想按字母顺序排序并删除重复项。我知道我可以这样做:如何从Python列表中删除重复项并保持顺序?

from sets import Set 
[...] 
myHash = Set(myList) 

但我不知道如何从哈希按字母顺序检索列表成员。

我没有结婚的散列,所以任何方式来完成此工作。此外,性能不是问题,所以我更愿意将代码中明确表达的解决方案更快速但更不透明的解决方案。

+0

另请参阅[此处](http://stackoverflow.com/q/7961363/1129682)以获取更多信息 – user1129682 2014-03-14 17:37:49

回答

176

列表可以被排序和去重复使用内置的功能:

myList = sorted(set(myList)) 
  • set是用于Python一个内置函数> = 2.3
  • sorted是用于Python一个内置函数> = 2.4
+5

表现力与简洁性完美融合。谢谢,罗德! – 2009-01-26 15:01:09

+10

如果您的myList具有不可用的对象,则这不起作用。 – 2012-11-14 11:30:04

+0

不会设置(排序(myList))更快?我的意思是,首先对列表进行排序并删除其重复项比首先删除重复项并仅在事后进行排序不是更快? – 2017-01-26 19:27:35

2

如果它的清晰度你之后,而不是速度,我觉得这是很清楚的:

def sortAndUniq(input): 
    output = [] 
    for x in input: 
    if x not in output: 
     output.append(x) 
    output.sort() 
    return output 

虽然它是O(n^2),但是对于输入列表的每个元素都重复使用not in。

11

如果输入已经排序,那么有可能是做一个简单的方法:

from operator import itemgetter 
from itertools import groupby 
unique_list = list(map(itemgetter(0), groupby(yourList))) 
1

>,但我不知道如何从按字母顺序排列的哈希检索列表成员。

不是真的你的主要问题,但对于将来参考使用sorted Rod的答案可用于遍历dict的按键的排序顺序

for key in sorted(my_dict.keys()): 
    print key, my_dict[key] 
    ... 

,也因为tuple的由第一有序元组的成员,你可以做同样的items

for key, val in sorted(my_dict.items()): 
    print key, val 
    ... 
0

对于字符串数据

output = [] 

    def uniq(input): 
     if input not in output: 
      output.append(input) 
print output  
4

如果要保留原始列表的顺序,只需使用OrderedDict和None作为值。

在Python2:

from collections import OrderedDict 
    from itertools import izip, repeat 

    unique_list = list(OrderedDict(izip(my_list, repeat(None)))) 

在Python3这是更简单:

from collections import OrderedDict 
    from itertools import repeat 

    unique_list = list(OrderedDict(zip(my_list, repeat(None)))) 

如果你不喜欢的迭代器(压缩和重复),可以使用一台发电机(都在2 &工作3):

from collections import OrderedDict 
    unique_list = list(OrderedDict((element, None) for element in my_list)) 
相关问题