【问题标题】:Combining lists of tuples based on a common tuple element基于公共元组元素组合元组列表
【发布时间】:2016-01-21 08:46:42
【问题描述】:

考虑两个元组列表:

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

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

每个元组包含两个元素:

  1. 一些字符串的列表(即[X1]
  2. data1data2common 元素:字符串'a''b' 等。

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

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

有人知道我该怎么做吗?

【问题讨论】:

  • @Idio,是的,我做过,但愿意看看其他人的想法,结果证明是非常有帮助的。

标签: python list


【解决方案1】:

您可以使用zip 函数和列表推导:

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

【讨论】:

    【解决方案2】:

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

    确实的解决方案使用 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'])]
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多