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]))]
>>> [(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)]
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)
读起来又短又痛苦,对不起。 我不记得为什么排序(set())有效而set()无效,但无论如何
你觉得
dict(test)
的输出怎么样或者,您可能希望将其转换回具有
编辑:这将保留最后一个指定值,但您也可以通过颠倒列表中的第一个值来保留第一个指定值:
Edit2:如果你也想保持列表顺序,这似乎是一个很好的单行解决方案(受Julien答案的启发):
最后,使用functools.reduce可以获得另一个一行:
说明:
lu
是仅具有唯一键的列表,i
是test
列表中的下一项。如果i[0]
,即下一个元素的键已经在lu
中,我们保持lu
,否则我们追加i
使用检查标志
Ex:
输出:
相关问题 更多 >
编程相关推荐