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

Win*_*sch 6 python tuples list duplicates

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

test = [('ent1', 24), ('ent2',12), ('ent3',4.5), ('ent1', 4), ('ent2', 3.5)]
Run Code Online (Sandbox Code Playgroud)

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

[('ent1', 24), ('ent2',12), ('ent3',4.5)]
Run Code Online (Sandbox Code Playgroud)

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

list(set(test))
Run Code Online (Sandbox Code Playgroud)

但这在这种情况下不起作用。有人有解决这个问题的适当方法吗?

tif*_*tif 9

您觉得 的输出如何dict(test)

{'ent1': 4, 'ent2': 3.5, 'ent3': 4.5}
Run Code Online (Sandbox Code Playgroud)

或者您可能想将其转换回元组列表

>>> list(dict(test).items())
[('ent1', 4), ('ent2', 3.5), ('ent3', 4.5)]
Run Code Online (Sandbox Code Playgroud)

编辑:这将保留最后分配的值,但您也可以通过首先反转列表来保留第一个分配的值:

>>> list(dict(reversed(test)).items())
[('ent2', 12), ('ent1', 24), ('ent3', 4.5)]
Run Code Online (Sandbox Code Playgroud)

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)]
Run Code Online (Sandbox Code Playgroud)

最后,你可以使用 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)]
Run Code Online (Sandbox Code Playgroud)

说明:lu是仅具有唯一键的列表,i是列表中的下一项test。如果i[0],即下一个元素的键已经存在lu,我们保留lu,否则我们追加i

  • dict 不保持顺序。这就是为什么我接受了另一个答案。 (2认同)

Rak*_*esh 2

使用检查标志

前任:

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) 
Run Code Online (Sandbox Code Playgroud)

输出:

[('ent1', 24), ('ent2', 12), ('ent3', 4.5)]
Run Code Online (Sandbox Code Playgroud)