【问题标题】:Nested list comprehension / merging nested lists嵌套列表理解/合并嵌套列表
【发布时间】:2014-05-26 21:36:16
【问题描述】:

我在理解嵌套列表理解结构时遇到了问题。

我有一个清单

>>> test
[[1, 2, 3], [4, 5], [6, 7, 8]]

如果我这样做

t2=[]
for x in test:
    for y in x:
        t2.append(y)

然后它返回

>>> t2
[1, 2, 3, 4, 5, 6, 7, 8]

这正是我想要的。但是为什么我不能这样做

t3=[y for y in x for x in test]

这给了我

>>> t3
[6, 6, 6, 7, 7, 7, 8, 8, 8]

谁能向我解释为什么 t3 与 t2 不同?我如何编写一个与 t2 相同的列表理解表达式?非常感谢您的帮助!

【问题讨论】:

    标签: python list-comprehension


    【解决方案1】:

    列表推导式中的for ... in ... 子句需要按照正常的 for 循环的顺序排列:

    >>> test = [[1, 2, 3], [4, 5], [6, 7, 8]]
    >>> t3 = [y for x in test for y in x]
    >>> t3
    [1, 2, 3, 4, 5, 6, 7, 8]
    >>>
    

    【讨论】:

      【解决方案2】:

      在您的代码中,在开始之前,来自上一个循环的x = [6, 7, 8](正如 jonsharpe 所指出的那样)。

      因此,它是这样展开的:

      for y in x:
          for x in test:
              t3.append(y)
      

      第一个循环中的x 指向[6, 7, 8],稍后会重新分配,但这不会更改第一个循环中使用的引用。如果第二个 x 有一个不同的名称,结果将是相同的。

      【讨论】:

        【解决方案3】:

        您需要反转for 循环:

        t3 = [y for x in test for y in x]
        

        否则(如果您不预先运行多行版本!)x 未定义。您的代码只是偶然运行 - x 仍然是前一个 for 循环结束时的样子,因此是您的结果。

        【讨论】:

          【解决方案4】:

          只要确保你知道itertools chain

          >>> test=[[1, 2, 3], [4, 5], [6, 7, 8]]
          >>> from itertools import chain
          >>> list(chain(*test))
          [1, 2, 3, 4, 5, 6, 7, 8]
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-12-24
            • 1970-01-01
            • 1970-01-01
            • 2019-08-20
            • 1970-01-01
            • 1970-01-01
            • 2013-08-07
            相关资源
            最近更新 更多