如何从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