我这里有一个这样的元组列表:
test = [('ent1', 24), ('ent2',12), ('ent3',4.5), ('ent1', 4), ('ent2', 3.5)]
我想从第一个元素已经出现的列表中删除那些元组。所以所需的输出将是
[('ent1', 24), ('ent2',12), ('ent3',4.5)]
我不知道该怎么做。通常,如果我想删除完全重复的元组,我会使用
list(set(test))
但这在这种情况下不起作用。有人有解决这个问题的合适方法吗?
你觉得 dict(test)
的输出如何?
{'ent1': 4, 'ent2': 3.5, 'ent3': 4.5}
或者您可能希望将其转换回元组列表
>>> list(dict(test).items())
[('ent1', 4), ('ent2', 3.5), ('ent3', 4.5)]
编辑:这将保留最后分配的值,但您也可以通过先反转列表来保留第一个分配的值:
>>> list(dict(reversed(test)).items())
[('ent2', 12), ('ent1', 24), ('ent3', 4.5)]
Edit2:如果你也想保留列表顺序,这似乎是一个很好的单行解决方案(受 Julien 的回答启发):
>>> [(uk,next(v for k,v in test if k == uk)) for uk in dict(test).keys()]
[('ent1', 24), ('ent2', 12), ('ent3', 4.5)]
最后,您可以使用 functools.reduce 获得另一个单行代码:
>>> from functools import reduce
>>> reduce(lambda lu,i:i[0] in dict(lu).keys() and lu or lu+[i], test, [])
[('ent1', 24), ('ent2', 12), ('ent3', 4.5)]
解释:lu
是只有唯一键的列表,i
是test
列表中的下一项。如果 i[0]
,即下一个元素的键已经在 lu
中,我们保留 lu
,否则我们追加 i
。