我有一个带有重复项的有序列表(比较相等的对象),我想删除重复项。由于我想保留订单,我无法使用set
。
我列表中的副本不会直接跟在对方之后,我想保留最后一次。在this related post中,似乎只保留了重复的第一个发生。
正如我简化的例子,这就是我想要的:
list_with_duplicates = [1, 2, 1, 3, 2, 1]
list_without_duplicates = [3, 2, 1]
我唯一能想到的是使用多次迭代首先保存每个副本的最后一次,然后使用最后一个重复项的顺序重新创建原始列表的混乱实现。
答案 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]