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

Posted

技术标签:

【中文标题】如何从 Python 列表中删除重复项并保持顺序? [复制]【英文标题】:How to remove duplicates from Python list and keep order? [duplicate] 【发布时间】:2010-10-03 13:18:03 【问题描述】:

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

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

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

我没有嫁给哈希,所以任何方法都可以做到这一点。此外,性能不是问题,因此我更喜欢在代码中清晰表达的解决方案,而不是快速但更不透明的解决方案。

【问题讨论】:

更多信息请参见here 这个问题,经过@ColonelPanic 的编辑,有点乱;标题中的问题和正文中的问题不一样。标题表明应保留原始订单,即预重复删除。但身体提出了一种情况,实际上这不是必需的。 【参考方案1】:

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

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

【讨论】:

如果您的 myList 有不可散列的对象,这将不起作用。 不会 set(sorted(myList)) 更快吗?我的意思是先对列表进行排序然后删除其重复项比先删除其重复项然后再对其进行排序不是更快吗? @CorneliuZuzu 使用 set() 删除重复项会更改顺序,因此您必须这样做 投反对票,因为有序和有序之间存在区别。 Ordered 表示保持原来的顺序,例如f([3,1,4,1,5,9,2,6,5,3,5]) = [3,1,4,5,9,2,6] @user3667349 “保持秩序”条款不是原始问题的一部分,它是在 2015 年由上校恐慌编辑添加的。【参考方案2】:

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

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

【讨论】:

这也可以表示为[e for e, _ in groupby(sortedList)] 这是 O(n) 而不是 O(n log n) 对吧? FWIW 在itertools 的文档中将类似的东西添加到recipes 的列表中。【参考方案3】:

如果您想保持原始列表的顺序,只需使用带有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))

【讨论】:

【参考方案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。

【讨论】:

【参考方案5】:

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

这不是您的主要问题,但为了将来参考 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
    ...

【讨论】:

【参考方案6】:

对于字符串数据

 output = []

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

【讨论】:

以上是关于如何从 Python 列表中删除重复项并保持顺序? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何根据元组的索引值从列表中删除重复的元组,同时保持元组的顺序? [复制]

OrderedDict如何在Python中保持秩序

在 Python 中,从列表中删除重复项以使所有元素都是唯一的*同时保留顺序*的最快算法是啥? [复制]

处理字符串列表以删除重复项并添加相应的值

python 数据类型

去除ArrayList中的重复元素并保持顺序