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

How to remove duplicates from Python list and keep order?

本问题已经有最佳答案,请猛点这里访问。

给定一个字符串列表,我想按字母顺序排序并删除重复项。我知道我能做到:

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

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

我并没有嫁给哈什,所以任何方法都可以做到这一点。另外,性能不是一个问题,所以我更喜欢用代码清晰地表示的解决方案,而不是快速但更不透明的解决方案。


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

1
myList = sorted(set(myList))
  • set是python>的内置函数,大于等于2.3
  • sorted是python>的内置函数,大于等于2.4


如果您的输入已经排序,那么可能有一种更简单的方法:

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


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

在Python 2:

1
2
3
4
    from collections import OrderedDict
    from itertools import izip, repeat

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

在python3中更简单:

1
2
3
4
    from collections import OrderedDict
    from itertools import repeat

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

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

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

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

1
2
3
4
5
6
7
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。


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

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

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

另外,由于tuple是由元组的第一个成员排序的,因此可以对items执行相同的操作:

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

对于字符串数据

1
2
3
4
5
6
 output = []

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