消除列表中重复项的最佳方法,但保持先前的相对顺序 [重复]

Posted

技术标签:

【中文标题】消除列表中重复项的最佳方法,但保持先前的相对顺序 [重复]【英文标题】:Best way to eliminate duplicates in a list, but keep previous relative order [duplicate] 【发布时间】:2012-06-19 00:49:51 【问题描述】:

可能重复:How do you remove duplicates from a list in Python whilst preserving order?Does Python have an ordered set?

我发现自己经常做以下事情:

list_of_items # I have a list of items
set(list_of_items) # I want to remove duplicates

但是,在转换为 set 时,我失去了列表中的初始排序,这很重要。

删除列表中的重复项并保持列表的初始(相对)顺序的最佳方法是什么?

【问题讨论】:

绝对是重复的。其中一个答案也与@Levon 提到的重复问题的答案几乎重复。 【参考方案1】:

这有点滥用列表推导式,但是:

seen = set()
item_list = [seen.add(item) or item for item in item_list if item not in seen]

【讨论】:

太棒了,谢谢! 理解左侧的or item 做了什么? seen.add(item) 返回None 所以or item 使表达式计算为item【参考方案2】:

使用字典删除重复项,将数据用作键,将任何内容用作值。如果它在字典中,请不要再次添加。

d = dict()
for i in range(0, len(list_of_items)):
    if(list_of_items[i] not in d):
        d[list_of_items[i]] = i
        list_of_items2.append(list_of_items[i])

【讨论】:

【参考方案3】:

有点骇人听闻,但是...

item_list = [x[1] for x in sorted(x[::-1] for x in dict(zip(item_list[::-1],range(len(item_list)))).items())][::-1]

【讨论】:

以上是关于消除列表中重复项的最佳方法,但保持先前的相对顺序 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

维护序列项顺序的同时消除重复项

Python List:这是在保留顺序的同时删除重复项的最佳方法吗? [复制]

如何在不删除先前相同值的情况下选择具有重复项的列表中的特定数字?

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

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

从Dart列表中删除重复项的2种方法