如何从Python列表中删除重复项并保持秩序?

给定一个string列表,我想按字母顺序sorting并删除重复项。 我知道我可以做到这一点:

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

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

我没有结婚的散列,所以任何方式来完成这个工作。 此外,性能不是一个问题,所以我更喜欢一个解决scheme,用代码清晰地expression一个快速但不透明的解决scheme。

列表可以使用内置函数进行sorting和重复数据删除:

 myList = sorted(set(myList)) 
  • set是Python> = 2.3的内置函数
  • sorted是Python> = 2.4的内置函数

如果您的input已经sorting,那么可能有一个更简单的方法来做到这一点:

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

如果要保留原始列表的顺序,只需使用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)))) 

如果你不喜欢迭代器(zip和重复),你可以使用一个生成器(工作在2和3):

  from collections import OrderedDict unique_list = list(OrderedDict((element, None) for element in my_list)) 

如果说清楚了,而不是速度,我想这很清楚:

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

它是O(n ^ 2),但是对于input列表中的每个元素都没有重复使用。

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

不是真正的主要问题,但为了将来的参考使用sorted罗德的答案可用于按sorting顺序遍历dict的键:

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

也因为tuple是由tuple的第一个成员sorting的,所以可以对items做同样的items

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

对于string数据

  output = [] def uniq(input): if input not in output: output.append(input) print output