我们可以使用 reduce 函数在单个理解表达式中做到这一点
from functools import reduce
from operator import add
[tuple([x]+reduce(add,([y[0]] for y in data1+data2 if y[1]==x))) for x in set(y[1] for y in data1+data2)]
如果列表很大,data1+data2 会造成严重的时间或内存损失,最好预先计算它
combdata = data1+data2
[tuple([x]+reduce(add,[y[0]] for y in combdata if y[1]==x))) for x in set(y[1] for y in combdata)]
此解决方案不依赖于两个列表中出现的所有“键”,或者顺序相同。
如果退货很重要,我们甚至可以这样做
sorted([tuple([x]+reduce(add,([y[0]] for y in data1+data2 if y[1]==x))) for x in set(y[1] for y in data1+data2)],key = lambda x,y=[x[0] for x in data1+data2]: y.index(x[1]))
以确保顺序与原始列表中的相同。同样,预计算 data1+data2 给出了
sorted([tuple([x]+reduce(add,([y[0]] for y in combdata if y[1]==x))) for x in set(y[1] for y in combdata)],key = lambda x,y=[x[0] for x in combdata]: y.index(x[1]))