Python 从列表中删除重复项:保留每个元素的顺序和最后一个重复项

Python 从列表中删除重复项:保留每个元素的顺序和最后一个重复项,python,list,duplicates,Python,List,Duplicates,我有一个包含重复项(比较相等的对象)的有序列表,我想删除重复项。由于我想维持秩序,我不能使用set 我列表中的重复项不直接在彼此之后出现,我希望保留最后一次出现。在这种情况下,似乎只保留了第一次出现的复制品 正如我简化的示例,这就是我想要的: list_with_duplicates = [1, 2, 1, 3, 2, 1] list_without_duplicates = [3, 2, 1] 我唯一能想到的是一个混乱的实现,它使用多次迭代,首先保存每个副本的最后一次出现,然后使用最后一次出

我有一个包含重复项(比较相等的对象)的有序列表,我想删除重复项。由于我想维持秩序,我不能使用
set

我列表中的重复项不直接在彼此之后出现,我希望保留最后一次出现。在这种情况下,似乎只保留了第一次出现的复制品

正如我简化的示例,这就是我想要的:

list_with_duplicates = [1, 2, 1, 3, 2, 1]
list_without_duplicates = [3, 2, 1]

我唯一能想到的是一个混乱的实现,它使用多次迭代,首先保存每个副本的最后一次出现,然后使用最后一次出现的副本的顺序重新创建原始列表。

您可以使用“:-1”反转列表:

>>> result = []
>>> for item in l[::-1]:
...     if item not in result:
...             result.append(item)
... 
>>> result[::-1]
[3, 2, 1]
>>> 

可以使用“:-1”反转列表:

>>> result = []
>>> for item in l[::-1]:
...     if item not in result:
...             result.append(item)
... 
>>> result[::-1]
[3, 2, 1]
>>> 

在链接副本中使用您喜欢的任何答案(例如),只需做一个更改:在遍历列表之前反转列表,完成后反转结果

def rem_rev(seq):
    seen = set()
    seen_add = seen.add
    return [x for x in seq[::-1] if not (x in seen or seen_add(x))][::-1]
    #                     ^^^^^^                                   ^^^^^^
    #                  or reversed(seq)

在链接副本中使用您喜欢的任何答案(例如),只需做一个更改:在遍历列表之前反转列表,完成后反转结果

def rem_rev(seq):
    seen = set()
    seen_add = seen.add
    return [x for x in seq[::-1] if not (x in seen or seen_add(x))][::-1]
    #                     ^^^^^^                                   ^^^^^^
    #                  or reversed(seq)
这件衣服看起来很整洁:

>>> x = [1, 2, 1, 3, 2, 1]
>>>
>>> from collections import OrderedDict
>>> list(reversed(OrderedDict.fromkeys(reversed(x))))
[3, 2, 1]
或:

这件衣服看起来很整洁:

>>> x = [1, 2, 1, 3, 2, 1]
>>>
>>> from collections import OrderedDict
>>> list(reversed(OrderedDict.fromkeys(reversed(x))))
[3, 2, 1]
或:


这也可能是一个干净的解决方案:

x = [1, 2, 1, 3, 2, 1]
sorted(set(x), key=lambda i: x[::-1].index(i), reverse=True)
# [3, 2, 1]

这也可能是一个干净的解决方案:

x = [1, 2, 1, 3, 2, 1]
sorted(set(x), key=lambda i: x[::-1].index(i), reverse=True)
# [3, 2, 1]

老实说,我并不真正理解布尔表达式。
或seen\u add(x)
用于什么?我猜它会以某种方式将
x
添加到
seen
中,如果它不在那里,但我不知道该元素的返回值是什么。@CGFoX-对于
seq[::-1]
中的每个元素,如果它不在
seen
中,它只在结果列表中包含该元素。如果seen中的
x不是这种情况,它将检查将
x
添加到
seen
的结果,该结果返回
None
。它基本上是“如果不存在,就包含它,如果不存在,就添加它。”老实说,我并不真正理解布尔表达式。
或seen\u add(x)
用于什么?我猜它会以某种方式将
x
添加到
seen
中,如果它不在那里,但我不知道该元素的返回值是什么。@CGFoX-对于
seq[::-1]
中的每个元素,如果它不在
seen
中,它只在结果列表中包含该元素。如果seen
中的
x不是这种情况,它将检查将
x
添加到
seen
的结果,该结果返回
None
。它基本上是“如果不存在,就包含它,如果不存在,就添加它。”