从以下输入实现转换的最 pythonic 方式是什么:
input = [('a', 1), ('a', 10), ('b', 244), ('c', 31) , ('c',45)]
到所需的输出:
output = [[('a',1),('a',10)],[('c',31),('c',45)]]
我分组的地方列出了具有相同第一个元素的元组。
感觉 Python 在一行中编写复杂的东西方面具有强大的潜力(我是新手),我决定使用综合列表。我最初的尝试是这样的:
output = [x for x in input if [k[0] for f in input].count(x[0])>1]
给我所有“伪”副本的漂亮列表:
output = [('a',1),('a',10),('c',31),('c',45)]
我进一步处理以获得我的结果。
我的问题是:有没有一种方法可以使用综合列表而不是两个(丑陋的)步骤在一行中实现这一结果?
请您参考如下方法:
使用 itertools 中的 groupby 和列表理解。这将为您提供一个简单的衬垫:
from itertools import groupby
filter(lambda x: len(x)>1, [list(g) for i,g in groupby(input, key=lambda x: x[0])])
[[('a', 1), ('a', 10)], [('c', 31), ('c', 45)]]
