如何排序和删除重复从 Python 列表?

给定一个字符串列表,我想按字母顺序排序并删除重复的字符串:

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

但我不知道如何从字母顺序的 hash 中检索列表成员。

我没有嫁给大麻,所以任何方法都可以实现这一点。另外,性能也不是问题,所以我更喜欢用代码清楚地表达的解决方案,而不是快速但更不透明的解决方案。

156365 次浏览

可以使用内置函数对列表进行排序和删除重复内容:

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

如果你追求的是清晰度而不是速度,我认为这很清楚:

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)))

> ,但我不知道如何从字母顺序的 hash 中检索列表成员。

这不是你的主要问题,但是为了将来的参考,Rod 的答案使用 sorted可以用来遍历 dict的键,按排序顺序:

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

也因为 tuple是由 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

如果希望保持原始列表的顺序,只需使用带有 None的 OrderedDect 作为值。

在 Python 2中:

    from collections import OrderedDict
from itertools import izip, repeat


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

在 Python 3中,它甚至更简单:

    from collections import OrderedDict
from itertools import repeat


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

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

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