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

2024-09-18 18:51:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个元组列表,如下所示:

test = [('ent1', 24), ('ent2',12), ('ent3',4.5), ('ent1', 4), ('ent2', 3.5)]

我想从第一个元素已经出现的列表中删除这些元组。所以期望的输出是

[('ent1', 24), ('ent2',12), ('ent3',4.5)]

我不知道怎么做。通常,如果我想删除完全重复的元组,我会使用

list(set(test))

但在这种情况下,这是行不通的。有没有人能找到解决这个问题的合适方法


Tags: 方法test元素列表情况list元组set
3条回答
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]))]

读起来又短又痛苦,对不起。 我不记得为什么排序(set())有效而set()无效,但无论如何

你觉得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

使用检查标志

Ex:

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)]

相关问题 更多 >