【问题标题】:How do you make long list comprehensions in python?你如何在 python 中进行长列表推导?
【发布时间】:2013-08-10 03:01:57
【问题描述】:

例如:

>>> [x for x in range(y) for y in range(z) for z in range(3)]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'y' is not defined

我希望这与以下行为相同:

>>> a=[]
>>> for z in range(3):
...   for y in range(z):
...     for x in range(3):
...       a.append(x)
... 
>>> a
[0, 1, 2, 0, 1, 2, 0, 1, 2]

但事实并非如此。为什么?

【问题讨论】:

  • documentation for comprehensions 解释了这一点。也许它可以写得更好,但是“......考虑到每个 for 或 if 子句,从左到右嵌套”似乎很清楚地表明你会得到与你期望的完全相反的嵌套顺序。

标签: python list-comprehension


【解决方案1】:

如果您颠倒循环的顺序,您当前的理解将起作用:

[x for z in range(3) for y in range(z) for x in range(3)]

【讨论】:

    【解决方案2】:

    按照与传统 for 循环相同的顺序放置循环:

    >>> [x for z in range(3) for y in range(z) for x in range(3)]
    [0, 1, 2, 0, 1, 2, 0, 1, 2]
    

    【讨论】:

      【解决方案3】:

      你可以这样想列表推导:

      [x for z in range(3)
             for y in range(z)
               for x in range(3) ]
      

      只需删除冒号,将 for 循环括在括号中,并在前面加上 x

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-13
        • 2021-03-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多