从 Python 列表中删除重复项

Posted

技术标签:

【中文标题】从 Python 列表中删除重复项【英文标题】:Removing duplicates from list of lists in Python 【发布时间】:2009-07-17 13:45:48 【问题描述】:

如果想根据每个嵌套列表的第一个元素评估重复项,谁能提出一个从嵌套列表中删除重复项的好解决方案?

主列表如下所示:

L = [['14', '65', 76], ['2', '5', 6], ['7', '12', 33], ['14', '22', 46]]

如果在第一个位置[k][0] 已经存在另一个具有相同元素的列表,那么我想删除该列表并得到这个结果:

L = [['14', '65', 76], ['2', '5', 6], ['7', '12', 33]]

你能推荐一个算法来实现这个目标吗?

【问题讨论】:

【参考方案1】:

您是否关心保留顺序/删除哪个重复项?如果没有,那么:

dict((x[0], x) for x in L).values()

会做的。如果您想保持顺序,并想保留找到的第一个,那么:

def unique_items(L):
    found = set()
    for item in L:
        if item[0] not in found:
            yield item
            found.add(item[0])

print list(unique_items(L))

【讨论】:

你对字典的转换比我想的要优雅得多,我偷了它:) 第一个不是也保留顺序吗,因为 dicts 自 Python 3.7 以来保留了顺序,并且键是按照理解生成它们的顺序插入的?【参考方案2】:

像这样使用字典:

L = '14': ['65', 76], '2': ['5', 6], '7': ['12', 33]
L['14'] = ['22', 46]

如果您从某个外部来源接收第一个列表,请将其转换为:

L = [['14', '65', 76], ['2', '5', 6], ['7', '12', 33], ['14', '22', 46]]
L_dict = dict((x[0], x[1:]) for x in L)

【讨论】:

【参考方案3】:

使用熊猫:

import pandas as pd

L = [['14', '65', 76], ['2', '5', 6], ['7', '12', 33], ['14', '22', 46],['7','a','b']]

df = pd.DataFrame(L)
df = df.drop_duplicates()

L_no_duplicates = df.values.tolist()

如果您想删除特定列中的重复项,请仅使用:

df = df.drop_duplicates([1,2])

【讨论】:

【参考方案4】:

我不确定你所说的“另一个列表”是什么意思,所以我假设你说的是 L 中的那些列表

a=[]
L = [['14', '65', 76], ['2', '5', 6], ['7', '12', 33], ['14', '22', 46],['7','a','b']]
for item in L:
    if not item[0] in a:
        a.append(item[0])
        print item

【讨论】:

如果你为 'a' 使用一个集合,这会更有效率 - 你使用这样的列表是 O(N^2),使用集合来摊销 O(N)。跨度> 没有想到,感谢您提供的信息。然而,该代码在不附带 set 的旧 Python 版本中工作。 ;)【参考方案5】:

如果顺序无关紧要,代码如下

print [ [k] + v for (k, v) in dict( [ [a[0], a[1:]] for a in reversed(L) ] ).items() ]

给予

[['2', '5', '6'], ['14', '65', '76'], ['7', '12', '33']]

【讨论】:

以上是关于从 Python 列表中删除重复项的主要内容,如果未能解决你的问题,请参考以下文章

使用 Python 删除对象列表中的重复项

python 从列表中删除重复项

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

从Python中的嵌套列表中删除连续的重复项?

使用python从不同长度的元组列表中删除重复项

在 Python 中,从列表中删除重复项以使所有元素都是唯一的*同时保留顺序*的最快算法是啥? [复制]