当前位置: 首页 > 知识库问答 >
问题:

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

叶国兴
2023-03-14

我有一个有重复项的有序列表(比较相等的对象),我想删除重复项。因为我想维持秩序,所以无法使用集合

我的列表中的重复项不会一个接一个地出现,我希望保留最后出现的项。在这篇相关的文章中,似乎只保留了第一次出现的重复。

作为我简化的例子,这是我想要的:

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

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

共有3个答案

百里金林
2023-03-14

有序的dict解决方案看起来非常整洁:

>>> 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]
闽焕
2023-03-14

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

>>> result = []
>>> for item in l[::-1]:
...     if item not in result:
...             result.append(item)
... 
>>> result[::-1]
[3, 2, 1]
>>> 
长孙弘盛
2023-03-14

在链接的副本中使用您喜欢的任何答案(例如顶部的答案),并进行一项更改:在迭代列表之前将其反转,并在完成后反转结果。

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)
 类似资料:
  • 我的变量如下所示: 我需要的是删除列表中的最后一个!我尝试检查文档,在上使用了函数,但不起作用。有什么想法或线索吗?谢谢!

  • 问题内容: 我只在前两个元素相同的情况下才尝试从嵌套列表中删除重复项,而忽略了第三个元素… 清单: 将返回: 我在这里找到了一种类似的简单方法: 但这仅适用于第一个元素而不适用于第一个2元素,而这正是我想要的。 问题答案: 如果顺序无关紧要,则可以使用相同的方法,但是将第一和第二个元素的元组用作键: 或在Python 2.7及更高版本上: 而不是您可以使用,而是使用您认为更具可读性的内容。

  • 问题内容: Google Python类| 清单练习- 给定一个数字列表,返回一个列表,其中所有相邻的==元素都已简化为单个元素,因此[1、2、2、3]返回[1、2、3]。您可以创建一个新列表或修改传入的列表。 我使用新列表的解决方案是- 问题甚至暗示可以通过修改传入列表来完成。但是,python文档警告不要在使用for循环迭代列表时修改元素。 我想知道除了遍历列表之外还能做些什么呢?我不是在寻找

  • 我下面有一个类,想删除包含同名的重复人,如何使用Java8 Lambda,预计列表包含下面的p1、p3。

  • 问题内容: 鉴于: 我想删除第一个项目中的那个项目。因此,在这种情况下,我们将删除以: 我当前的代码是: 这可行,但是很慢。什么是更好的方法呢? 编辑:我之前没有测试过性能,所以我可能做错了,但是我得到了: 问题答案: 反向删除,就地修改: 就地修改意味着这样做效率更高,因为它不会创建新列表(如列表理解那样)。 由于OP要求提供高效的解决方案,因此这里比较了两个投票最高的答案。 设定 - 清单理解

  • 我试图编写一个代码,它接收并删除该中的重复字符。 例如。如果,则应返回。到目前为止,我的代码只返回与给定的相同的tekst…