Python中从列表中删除重复的列表元素

13

有人能否提供一个好的解决方案,以删除嵌套列表中基于每个嵌套列表的第一个元素进行重复项的方法?

主列表看起来像这样:

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]]

能否建议一个算法以实现这个目标?

6个回答

32

你是否关心保留顺序/要删除哪个重复项?如果不关心,那么:

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))

你的转换成字典的方式比我的优雅多了,我把它偷走了 :) - Jiaaro
第一个不也保留顺序吗?因为自 Python 3.7 开始,字典会保留顺序,并且键是按照推导式生成它们的顺序插入的。 - xuiqzy

4
使用字典来替代,代码如下:
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)

2

使用Pandas:

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])

0
def Remove(duplicate):
    final_list = []
    for num in duplicate:
        if num not in final_list:
            final_list.append(num)
    return final_list

duplicate = [2, 4, 10, 20, 5, 2, 20, 4]
print(Remove(duplicate))

1
请提供有关您的代码以及对原始代码所做更改的一些评论。 - SLDem

0

我不确定你所说的“另一个列表”是什么意思,所以我假设你是在说 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

1
如果你使用一个集合(set)来处理“a”,会更加高效 - 相对于使用列表,你现在的时间复杂度是O(N^2),但使用集合的情况下平均时间复杂度为O(N)。 - RichieHindle
那个没想到,谢谢提供信息。不过,那段代码在旧版本的Python中可以运行,因为它没有set。;) - ghostdog74

0
如果顺序不重要,使用以下代码
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']]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接