我这里有一个像这样的图元列表。

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

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

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

我不知道如何做到这一点。通常情况下,如果我想删除完全重复的图元,我会使用

list(set(test))

但在这种情况下,这是不可行的。有人对这个问题有合适的办法吗?

python
list
duplicates
tuples
WinterMensch
WinterMensch
发布于 2018-08-06
3 个回答
tif
tif
发布于 2018-08-06
已采纳
0 人赞同

How do you like the output of 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)]

编辑2:如果你也想保留列表顺序,这似乎是一个很好的单行本解决方案(受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

dict并没有保持秩序。这就是为什么我接受了另一个答案。
tif
@WinterMensch 相应地更新了我的答案。
@WinterMensch 在Python 3.6及以后版本中,dictdoes keep the order. However, set still doesn't keep the order, so your code in the question doesn't preserve order.
tif
@WinterMensch 我想现在我找到了一个优雅的 good 1-liner solution.
Rakesh
Rakesh
发布于 2018-08-06
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) 

Output:

[('ent1', 24), ('ent2', 12), ('ent3', 4.5)]
    
Julien Cochennec
Julien Cochennec
发布于 2018-08-06
0 人赞同
test = [('ent1', 24), ('ent2',12), ('ent3',4.5), ('ent1', 4), ('ent2', 3.5)]