【问题标题】:How to append elements from a multi-dimensional list into 2nd multi-dimensional list如何将多维列表中的元素附加到第二个多维列表中
【发布时间】:2021-10-02 16:46:23
【问题描述】:

我正在尝试将多维列表中的元素附加到第二个多维列表中。这是我写的代码-

my_list = [[['b', ['a'], 'c'], ['d', ['a', 'b'], 'e']], 
           [['j', ['a', 'f']], ['q', 't']]]
ref_list = [[['q', 'w', 't'], ['y', 'u']], 
            [['s', 'o'], ['p', 'k', 'l']]]

newlist = []
for num, i in enumerate(my_list): 
  small_list = [] 
  for num_1, j in enumerate(i): 
    semilist = []
    for k in j:        
      if isinstance(k, list):      
        onelist = []
        for a in k:
          for ii in ref_list[num][num_1]:
            onelist.append(ii)           
        semilist.append(onelist)
      else:
        semilist.append(k)
    small_list.append(semilist)
  newlist.append(small_list)
      
print(newlist)

我得到的输出是 -

[[['b', ['q', 'w', 't'], 'c'], ['d', ['y', 'u', 'y', 'u'], 'e']], [['j', ['s', 'o', 's', 'o']], ['q', 't']]]

我正在寻找的输出是排序 -

[[['b', ['q', 'w', 't'], 'c'], ['d', ['y', 'u'], 'e']], [['j', ['s', 'o']], ['p', 'k', 'l']]]

我想用“ref_list”的元素替换“my_list”最内层列表的元素。

【问题讨论】:

    标签: python arrays list multidimensional-array nested


    【解决方案1】:

    试试:

    my_list = [
        [["b", ["a"], "c"], ["d", ["a", "b"], "e"]],
        [["j", ["a", "f"]], ["q", "t"]],
    ]
    
    ref_list = [[["q", "w", "t"], ["y", "u"]], [["s", "o"], ["p", "k", "l"]]]
    
    
    for a, b in zip(my_list, ref_list):
        for i, subl in enumerate(a):
            for ii, v in enumerate(subl):
                if isinstance(v, list):
                    subl[ii] = b[i]
                    break
            else:
                a[i] = b[i]
    
    print(my_list)
    

    打印:

    [
        [["b", ["q", "w", "t"], "c"], ["d", ["y", "u"], "e"]],
        [["j", ["s", "o"]], ["p", "k", "l"]],
    ]
    

    编辑:从第二个列表追加元素而不是替换:

    my_list = [
        [["b", ["a"], "c"], ["d", ["a", "b"], "e"]],
        [["j", ["a", "f"]], ["q", "t"]],
    ]
    
    ref_list = [[["q", "w", "t"], ["y", "u"]], [["s", "o"], ["p", "k", "l"]]]
    
    
    for a, b in zip(my_list, ref_list):
        for i, subl in enumerate(a):
            for ii, v in enumerate(subl):
                if isinstance(v, list):
                    subl[ii].extend(b[i])
                    break
            else:
                a[i].extend(b[i])
    
    print(my_list)
    

    打印:

    [
        [["b", ["a", "q", "w", "t"], "c"], ["d", ["a", "b", "y", "u"], "e"]],
        [["j", ["a", "f", "s", "o"]], ["q", "t", "p", "k", "l"]],
    ]
    

    EDIT2:在第一个列表的开头添加第二个列表的元素:

    my_list = [
        [["b", ["a"], "c"], ["d", ["a", "b"], "e"]],
        [["j", ["a", "f"]], ["q", "t"]],
    ]
    
    ref_list = [[["q", "w", "t"], ["y", "u"]], [["s", "o"], ["p", "k", "l"]]]
    
    
    for a, b in zip(my_list, ref_list):
        for i, subl in enumerate(a):
            for ii, v in enumerate(subl):
                if isinstance(v, list):
                    subl[ii] = b[i] + subl[ii]
                    break
            else:
                a[i] = b[i] + a[i]
    
    print(my_list)
    

    打印:

    [
        [["b", ["q", "w", "t", "a"], "c"], ["d", ["y", "u", "a", "b"], "e"]],
        [["j", ["s", "o", "a", "f"]], ["p", "k", "l", "q", "t"]],
    ]
    

    【讨论】:

    • 能否请您在代码中解释/添加 cmets。它有效,但我无法理解。逻辑对我来说似乎很复杂(我是 Python 的初学者)。 else 子句与外部 if 子句不匹配。那还有什么用?在这种情况下,else 子句还有什么作用?
    • @KatrinaMarrie 那是for-else 声明。 else 之后的块被执行,当 break 没有在内部 for 中调用时。它在 Python 中不是众所周知的功能,但它确实存在。
    • 如果我想将第二个列表的元素附加到第一个列表的内部 linst 中而不是替换它们。我正在尝试for a, b in zip(my_list, ref_list): for i, subl in enumerate(a): for ii, v in enumerate(subl): if isinstance(v, list): for j in b[i]: v.append(j) break else: a[i] = b[i]
    • 这似乎不起作用,因为我得到的输出是 - [[['b', ['a', 'q', 'w', 't'], 'c'], ['d', ['a', 'b', 'y', 'u'], 'e']], [['j', ['a', 'f', 's', 'o']], ['p', 'k', 'l']]]
    • @KatrinaMarrie 你也需要在else:之后更改a[i] = b[i]
    【解决方案2】:

    试试:

    ref_list_flat = [l for sublist in ref_list for l in sublist]
    
    for i, l1 in enumerate(my_list):
        for j, l2 in enumerate(l1):
            #check if this is the innermost list
            if not any(isinstance(l3, list) for l3 in l2):
                my_list[i][j] = ref_list_flat.pop(0)
            else:
                for k, l3 in enumerate(l2):
                    if isinstance(l3, list):
                        my_list[i][j][k] = ref_list_flat.pop(0)
    
    >>> my_list
    [[['b', ['q', 'w', 't'], 'c'], ['d', ['y', 'u'], 'e']],
     [['j', ['s', 'o']], ['p', 'k', 'l']]]
    

    【讨论】:

      猜你喜欢
      • 2021-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多