从 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 列表中删除重复项的主要内容,如果未能解决你的问题,请参考以下文章