Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于公共元组元素组合元组列表_Python_List - Fatal编程技术网

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

Python 基于公共元组元素组合元组列表,python,list,Python,List,考虑两个元组列表: data1 = [([X1], 'a'), ([X2], 'b'), ([X3], 'c')] data2 = [([Y1], 'a'), ([Y2], 'b'), ([Y3], 'c')] 其中len(data1)==len(data2) 每个元组包含两个元素: 一些字符串的列表(即[X1]) 用于data1和data2的通用元素:字符串'A','b',等等 我想把它们结合成以下几点: [('a', [X1], [Y1]), ('b', [X2], [Y2]),...]

考虑两个元组列表:

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

每个元组包含两个元素:

  • 一些字符串的列表(即
    [X1]
  • 用于
    data1
    data2
    通用元素:字符串
    'A'
    'b'
    ,等等
  • 我想把它们结合成以下几点:

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

    有人知道我怎么做吗

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

    [(s1,l1,l2) for (l1,s1),(l2,s2) in zip(data1,data2)]
    
    如果
    数据
    列表中所有元素的顺序相同,则的解决方案是好的。如果他们没有,它不会考虑到这一点

    一种解决方案,利用了

    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)
    
    要获取列表,只需将其包装在调用中:


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

    @伊迪奥,是的,我有,但我愿意看到其他人的想法,结果是非常有用的。
    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]))