【问题标题】:iteration over python nested lists迭代python嵌套列表
【发布时间】:2018-08-19 13:40:47
【问题描述】:

我需要将列表 'a' 转换为列表 'b' , 怎么办?

a = [[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12,]]]

b = [[[1, 2, 3, 4, 5, 6]], [[7, 8, 9, 10, 11, 12,]]]

【问题讨论】:

  • 以更简单的方式?艰难的路是什么?请在问题中包含您尝试过的内容。
  • 你能详细说明你真正要做什么吗?我假设您需要将列表 a 转换为列表 b
  • a = [[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12,]]] c = [[], []] for j in range(len(a)): for i in range(len(a[j])): c[j].extend(a[j][i]) print(' c', c) # 我是这样做的,但我觉得很丑

标签: python list nested nested-lists


【解决方案1】:

我建议以下列表理解:

In [1]: a = [[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12,]]]
   ...:

In [2]: [[[a for sub in nested for a in sub]] for nested in a]
Out[2]: [[[1, 2, 3, 4, 5, 6]], [[7, 8, 9, 10, 11, 12]]]

相当于下面的嵌套for循环:

result = []
for nested in a:
    _temp = []
    for sub in nested:
        for a in sub:
            _temp.append(a)
    result.append([_temp])

虽然,我会写得更像:

result = []
for nested in a:
    _temp = []
    for sub in nested:
        _temp.extend(sub)
    result.append([_temp])

【讨论】:

    【解决方案2】:

    您可以使用 sum() 的巧妙技巧来加入嵌套列表:

    [[sum(l, [])] for l in a]
    #[[[1, 2, 3, 4, 5, 6]], [[7, 8, 9, 10, 11, 12]]]
    

    为了更清楚为什么它有效,请考虑以下示例:

    >>> sum([[1,2], [3,4]], [])
    [1, 2, 3, 4]
    

    或者您可以使用更高效的itertools.chain_from_iterable 方法:

    flatten = itertools.chain.from_iterable
    [[list(flatten(l))] for l in a]
    #[[[1, 2, 3, 4, 5, 6]], [[7, 8, 9, 10, 11, 12]]]
    

    【讨论】:

    • 不要使用sum 来展平列表。
    • @juanpa.arrivillaga 为什么不呢?
    • 这是它的gist。虽然,sum 在最近的版本中可能已经针对字符串进行了优化(比如 3.6)
    • @juanpa.arrivillaga 哇!从来不知道性能差异会如此巨大 - 感谢您进行可视化。如果您可以偷看,我删除了有关来源的评论:)
    • 是的,与序列的连接通常是 python 内置的线性时间。所以循环执行是二次时间。我认为这只是一种需要避免的模式,它可能不会显着影响代码的性能,具体取决于嵌套列表的实际形状,即内部列表的数量是否预计会很小。
    【解决方案3】:

    您可以使用列表推导:这假设您在每个子列表中只有两个子子列表。既然你的输入输出很清楚,它就做你想做的事

    a = [[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12,]]]
    b = [[c[0] + c[1]] for c in a ]
    print (b)
    

    输出

    [[[1, 2, 3, 4, 5, 6]], [[7, 8, 9, 10, 11, 12]]]
    

    【讨论】:

    • 感谢您的回答,对不起,在实际列表“a”太大之前我没有提及。它里面包含 60000 个嵌套列表。我只是写小样本列表。所以我看到列表理解很好地解决了小列表的问题,但是大列表呢?
    • 你的意思是,而不是 c[0]c[1] 你有元素上升到 c[59999]
    • 感谢您的回答,对不起,在实际列表“a”太大之前我没有提及。列表形状为 1 x 60000 x 25 x 3。我只写小样本列表。所以我看到列表理解很好地解决了小列表的问题,但是大列表呢?
    【解决方案4】:

    实现两个列表连接的另一种方法如下:

    a = [[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12,]]]
    
    b = list(map(lambda elem: [[*elem[0], *elem[1]]],a))
    print(b)
    

    输出:

    [[[1, 2, 3, 4, 5, 6]], [[7, 8, 9, 10, 11, 12]]]
    

    【讨论】:

      【解决方案5】:

      我建议使用循环方法。

      a = [[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12,]]]
      b = []
      for i in a:
          new_j = []
          for j in i:
              new_j.extend(j)
          new_i = [new_j]
          b = b + [new_i]
      b
      

      【讨论】:

        猜你喜欢
        • 2011-10-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-11
        • 2016-12-27
        • 1970-01-01
        • 2021-02-22
        • 2014-06-08
        相关资源
        最近更新 更多