python - 根据元组的第一个条目从列表中删除重复的元组

标签 python list duplicates tuples

<分区>

我这里有一个这样的元组列表:

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 是只有唯一键的列表,itest 列表中的下一项。如果 i[0],即下一个元素的键已经在 lu 中,我们保留 lu,否则我们追加 i

关于python - 根据元组的第一个条目从列表中删除重复的元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51705399/

相关文章:

Python -- 在同一个包内的模块中导入包

python-3.x - 如何在 Python 的列表中找到 "nearest neighbors"?

根据日期删除重复项

python - 使用 pep8 扫描完整的目录树

python - OData Python 库可用吗?

python - 如何获取列表中字典的索引

java - 是否指向列表中的某些元素,限制列表被GC?

regex - 在 Notepad++ 中查找重复单词

mysql - 如何为列中具有重复值的行建立索引?

python - 在 wxPython 中进行拖放的 OLE 方式