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

Mrv*_*Mrv 2 python list

考虑两个元组列表:

data1 = [([X1], 'a'), ([X2], 'b'), ([X3], 'c')]
data2 = [([Y1], 'a'), ([Y2], 'b'), ([Y3], 'c')]
Run Code Online (Sandbox Code Playgroud)

哪里 len(data1) == len(data2)

每个元组包含两个元素:

  1. 一些字符串列表(即[X1])
  2. 一个常见的元素data1data2:字符串'a','b'等等.

我想将它们组合成以下内容:

[('a', [X1], [Y1]), ('b', [X2], [Y2]),...]
Run Code Online (Sandbox Code Playgroud)

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

Kas*_*mvd 7

您可以使用zip函数和列表理解:

[(s1,l1,l2) for (l1,s1),(l2,s2) in zip(data1,data2)]
Run Code Online (Sandbox Code Playgroud)


Jim*_*ard 5

如果data列表中的所有元素的顺序相同,@ Kasssvd的解决方案很好.如果不是,则不考虑这一点.

一个解决方案,确实,利用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)
Run Code Online (Sandbox Code Playgroud)

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

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