基于公共元组元素组合元组列表

时间:2016-01-21 08:46:42

标签: python list

考虑两个元组列表:

data1 = [([X1], 'a'), ([X2], 'b'), ([X3], 'c')]
data2 = [([Y1], 'a'), ([Y2], 'b'), ([Y3], 'c')]

len(data1) == len(data2)

每个元组包含两个元素:

  1. 一些字符串列表(即[X1]
  2. data1data2常见元素:字符串'a''b'等。
  3. 我想将它们组合成以下内容:

    [('a', [X1], [Y1]), ('b', [X2], [Y2]),...]
    

    有谁知道我怎么做到这一点?

3 个答案:

答案 0 :(得分:7)

您可以使用zip功能和列表理解:

[(s1,l1,l2) for (l1,s1),(l2,s2) in zip(data1,data2)]

答案 1 :(得分:5)

如果data列表中的所有元素的顺序相同,则

@Kasramvd的解决方案很好。如果不是,则不会考虑到这一点。

的解决方案,使用 defaultdict

from collections import defaultdict

d = defaultdict(list)  # values are initialized to empty list

data1 = [("s1", 'a'), ("s2", 'c'), ("s3", 'b')]
data2 = [("s1", 'c'), ("s2", 'b'), ("s3", 'a')]

for value, common in data1 + data2:
    d[common].append(value)

为了获得它的列表,只需将其包裹在list()调用中:

res = list(d.items())
print(res)
# Prints: [('b', ['s3', 's2']), ('a', ['s1', 's3']), ('c', ['s2', 's1'])]

答案 2 :(得分:1)

我们可以使用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]))