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

时间:2016-12-18 21:03:18

标签: python list duplicates

我有一个带有重复项的有序列表(比较相等的对象),我想删除重复项。由于我想保留订单,我无法使用set

我列表中的副本不会直接跟在对方之后,我想保留最后一次。在this related post中,似乎只保留了重复的第一个发生。

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

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

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

5 个答案:

答案 0 :(得分:2)

在链接副本中使用您喜欢的任何答案(例如top one),只需进行一项更改:在迭代之前撤消列表,并在完成后撤消结果。

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)

答案 1 :(得分:0)

您可以使用' :: - 1':

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

答案 2 :(得分:0)

ordered dict solution看起来非常整洁:

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

或:

>>> list(OrderedDict.fromkeys(x[::-1]))[::-1]
[3, 2, 1]

答案 3 :(得分:0)

>>> def keep_second(x, y):
>>>     return y
>>> [functools.reduce(keep_second, group) for _, group in itertools.groupby(sorted(items, key=key_func), key=key_func)

答案 4 :(得分:0)

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

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