我有一个如下所示的列表:
[(1, 0.3), (3, 0.2), (3, 0.15), (1, 0.07), (1, 0.02), (2, 0.01)]
我想根据每个元组中的第一项保留此列表中首次找到的重复项:
[(1, 0.3), (3, 0.2), (2, 0.01)]
有一种有效的方法吗?
答案 0 :(得分:7)
如果结果列表的顺序无关紧要,只要它包含每个元组的原始列表中的第一个条目:首先反转列表,然后将其传递给dict
以删除重复项并保留每个键的最后条目(原始列表中的第一个,因为它已被反转):
>>> items = [(1, 0.3), (3, 0.2), (3, 0.15), (1, 0.07), (1, 0.02), (2, 0.01)]
>>> list(dict(reversed(items)).items())
[(1, 0.3), (2, 0.01), (3, 0.2)]
如果结果列表的顺序很重要,请参阅Padraic的答案:)
答案 1 :(得分:4)
如果您使用生成器功能,您可以懒洋洋地返回第一个欺骗,您需要存储的是一旦该功能结束将成为gc&#d; dd的键:
def first_found(l):
seen = set()
for k, v in l:
if k not in seen:
yield (k, v)
seen.add(k)
您的列表会给您:
print(list(first_found(l)))
[(1, 0.3), (3, 0.2), (2, 0.01)]
或者更新原始列表:
l[:] = first_found(l)
或者创建一个词典:
od = OrderedDict(first_found(l))
print(od)
OrderedDict([(1, 0.3), (3, 0.2), (2, 0.01)])