【问题标题】:How to merge two nested lists and output a list of lists of tuples?如何合并两个嵌套列表并输出元组列表?
【发布时间】:2019-03-14 16:31:36
【问题描述】:

我有两个嵌套列表,list_alist_b

list_a=[['a','b'],['c','d','e'],['f','g','f']]
list_b=[[5,7],[2,3,2],[4,7,8]]

我正在尝试生成list_c,这将是将list_a 中的每个元素与list_b 中的相应元素合并的结果,例如list_a[1][1]list_b[1][1]list_a[1][2]list_b[1][2] 等. 生成元组列表。

list_c=[[('a',5),('b',7)],[('c',2),('d',3),('e',2)],[('f',4),('g',7),('f',8)]]

我已经试过了:

list_c=[]
for list1 in list_a:
    for list2 in list_b:
        list_c.append(list(zip(list1,list2)))

但是这个输出是原始列表中所有可能的元素组合的元组列表的列表:

[[('a', 5), ('b', 7)], [('a', 2), ('b', 3)], 
 [('a', 4), ('b', 7)], [('c', 5), ('d', 7)],...
 [('f', 2), ('g', 3), ('f', 2)], 
 [('f', 4), ('g', 7), ('f', 8)]]

我觉得我已经接近正确答案了,但缺少一些简单的东西。如何生成我正在寻找的结构的list_c? (保留顺序很重要,因为我想用它来处理 CSV 文件)

这是对此处提出的问题的扩展: Concatenate items in two nested lists to pairs in tuples

但我找不到任何不涉及将结果列表展平为以下内容的类似问题:

list_c=[('a',5),('b',7),('c',2),('d',3),('e',2),('f',4),('g',7),('f',8)]

【问题讨论】:

  • 您可以使用主题中的“扁平化方法”:[将两个嵌套列表中的项目连接到元组中的对] (stackoverflow.com/questions/20845767/…) 以获得这样的第一个列表:[('a',5),('b',7),('c',2),('d',3),('e',2),('f',4),('g',7),('f',8)],然后创建一个空列表,并将前一个添加到其中,不是吗?
  • zip 文档。

标签: python list nested zip tuples


【解决方案1】:

你需要zip 超过list_alist_b,而不是嵌套for循环(一个产品): 大意是:

[list(zip(a,b)) for a,b in zip(list_a, list_b)]

换句话说:

result = []
for a, b in zip(list_a, list_b):
    result.append(list(zip(a,b)))

【讨论】:

    【解决方案2】:
    list_c = []
    for i, element_a in enumerate(list_a):
        element_b = list_b[i]
        merged_list = []
        for j in range(len(element_a)):
            merged_list.append((element_a[j], element_b[j]))
        list_c.append(merged_list)
    

    为每个列表索引中的每个元素创建新元组并追加到主列表

    【讨论】:

      【解决方案3】:

      使用列表理解

      a=[['a','b'],['c','d','e'],['f','g','f']]
      b=[[5,7],[2,3,2],[4,7,8]]
      
      c = [list(zip(i,j)) for i,j in zip(a,b)]
      
      print(c)
      
      """
      output 
      
      
      [[('a', 5), ('b', 7)],
       [('c', 2), ('d', 3), ('e', 2)],
       [('f', 4), ('g', 7), ('f', 8)]]
      
      """
      

      使用 lambda 函数可以做到这一点

      d=list(map(lambda x,y:list(zip(x,y)),a,b))
      print(d) 
      """
      output 
      
      [[('a', 5), ('b', 7)],
       [('c', 2), ('d', 3), ('e', 2)],
       [('f', 4), ('g', 7), ('f', 8)]]
      
      """
      

      【讨论】:

      • 不要使用reduce(add 来展平列表,这是一种反模式,因为它是二次时间。这也不是想要的输出。
      • @juanpa.arrivillaga 我只是建议一种方法,你是对的,它需要时间,并且输出是正确的。我不在这里考虑快速解决方案
      • 输出正确。所需的输出是list_c=[[('a',5),('b',7)],[('c',2),('d',3),('e',2)],[('f',4),('g',7),('f',8)]]。并且不要建议众所周知的反模式,除非你想被否决。成千上万的人会不假思索地复制并粘贴它。那里有足够多的懒惰程序员编写蹩脚的软件。不要启用它。
      • @juanpa.arrivillaga 那些懒惰的程序员甚至没有完全阅读这个问题。您需要再次阅读操作在输出中要求的内容
      • @juanpa.arrivillaga我很抱歉我的粗鲁和证明是错误的(设计太多的解决方案)。我已经更新了解决方案。感谢您帮助改进解决方案。
      【解决方案4】:

      由于已经采用了最好的和更短的方法..,另一个带有旧的冗长 for 循环的选项:

      list_c = []
      for i, a in enumerate(list_a):
        tmp = []
        for j, b in enumerate(list_b[i]):
          tmp.append((a[j], b))
        list_c.append(tmp)
      
      list_c
      #=> [[('a', 5), ('b', 7)], [('c', 2), ('d', 3), ('e', 2)], [('f', 4), ('g', 7), ('f', 8)]]
      

      【讨论】:

        猜你喜欢
        • 2012-10-15
        • 1970-01-01
        • 2021-11-01
        • 2020-02-19
        • 1970-01-01
        • 2012-08-31
        • 1970-01-01
        • 2021-11-11
        • 1970-01-01
        相关资源
        最近更新 更多