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

时间:2018-08-06 10:19:34

标签: 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))

,但是在这种情况下不起作用。有没有人适合这个问题的方法?

3 个答案:

答案 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是仅具有唯一键的列表,itest列表中的下一项。如果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)]