如何从Python列表中删除重复项并保持顺序?
问题描述:
给定一个字符串列表,我想按字母顺序排序并删除重复项。我知道我可以这样做:如何从Python列表中删除重复项并保持顺序?
from sets import Set
[...]
myHash = Set(myList)
但我不知道如何从哈希按字母顺序检索列表成员。
我没有结婚的散列,所以任何方式来完成此工作。此外,性能不是问题,所以我更愿意将代码中明确表达的解决方案更快速但更不透明的解决方案。
答
如果它的清晰度你之后,而不是速度,我觉得这是很清楚的:
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。
答
如果输入已经排序,那么有可能是做一个简单的方法:
from operator import itemgetter
from itertools import groupby
unique_list = list(map(itemgetter(0), groupby(yourList)))
答
>,但我不知道如何从按字母顺序排列的哈希检索列表成员。
不是真的你的主要问题,但对于将来参考使用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
...
答
对于字符串数据
output = []
def uniq(input):
if input not in output:
output.append(input)
print output
答
如果要保留原始列表的顺序,只需使用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))
另请参阅[此处](http://stackoverflow.com/q/7961363/1129682)以获取更多信息 – user1129682 2014-03-14 17:37:49