从Python列表中删除重复项
问题描述:
任何人都可以提出一个很好的解决方案,如果想根据每个嵌套列表的第一个元素来评估重复项,那么可以从嵌套列表中删除重复项?从Python列表中删除重复项
主要名单如下:
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]]
你能提出一个算法来实现这个目标吗?
答
你关心维护命令/哪个重复被删除?如果不是,那么:
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))
答
我不知道你所说的“另一个列表”的意思,所以我想你说的里面大号
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
答
这些名单使用的字典,而不是像这样:
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)
答
如果顺序并不重要,下面的代码
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']]
答
使用熊猫:
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])
,如果你使用“一”一组这将是更有效的 - 你是O(N^2)使用这样的列表,并使用一个集合分摊O(N)。 – RichieHindle 2009-07-17 13:58:07
,但没有想到,感谢您的信息。不过,该代码可以在不带set的旧Python版本中使用。 ;) – ghostdog74 2009-07-17 14:14:17