我这里有一个类似这样的元组列表:
test = [('ent1', 24), ('ent2',12), ('ent3',4.5), ('ent1', 4), ('ent2', 3.5)]
我想从第一个元素已经出现的列表中删除那些元组。因此所需的输出将是
[('ent1', 24), ('ent2',12), ('ent3',4.5)]
我不知道该怎么做。通常,如果我想删除完全重复的元组,我会使用
list(set(test))
,但是在这种情况下不起作用。有没有人适合这个问题的方法?
答案 0 :(得分:2)
您如何看待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
。
答案 1 :(得分:1)
test = [('ent1', 24), ('ent2',12), ('ent3',4.5), ('ent1', 4), ('ent2', 3.5)]
deduplicated_test = [(s,[t[1] for t in test if t[0] == s][0]) for s in sorted(set([t[0] for t in test]))]
阅读简短而痛苦,抱歉。 我不记得为什么sorted(set())起作用而set()却不起作用...
答案 2 :(得分:0)
使用检查标记
例如:
test = [('ent1', 24), ('ent2',12), ('ent3',4.5), ('ent1', 4), ('ent2', 3.5)]
check_val = set() #Check Flag
res = []
for i in test:
if i[0] not in check_val:
res.append(i)
check_val.add(i[0])
print(res)
输出:
[('ent1', 24), ('ent2', 12), ('ent3', 4.5)]