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

时间:2009-01-26 14:09:15

标签: python list sorting unique

给定一个字符串列表,我想按字母顺序对其进行排序并删除重复项。我知道我可以这样做:

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

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

我没有和哈希结婚,所以任何方法都可以实现。此外,性能不是问题,因此我更倾向于使用代码清楚地表达一个快速但不透明的解决方案。

6 个答案:

答案 0 :(得分:186)

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

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

答案 1 :(得分:10)

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

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

答案 2 :(得分:4)

如果您想保留原始列表的顺序,只需使用带有None的OrderedDict作为值。

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

答案 3 :(得分:2)

如果它清晰,你是在追求,而不是速度,我认为这是非常明确的:

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。

答案 4 :(得分:1)

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

不是你的主要问题,但是为了将来的参考,Rod使用sorted的答案可以用于按排序顺序遍历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
    ...

答案 5 :(得分:0)

对于字符串数据

 output = []

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