【问题标题】:Is there a limit to how many for loops you can nest in a list comprehension?您可以在列表理解中嵌套多少个 for 循环是否有限制?
【发布时间】:2020-04-20 16:25:35
【问题描述】:

我想知道为什么以下列表理解失败 (UnboundLocalError: local variable 'y_value' referenced before assignment)。如果我在一个三重嵌套的 for 循环中逐字地拼出 for 循环,我会很好地得到我想要的结果。

for y_value_group in collinear_y_values:
    all_y_values = []
    for y_value in y_value_group:
        for line_id in horizontal_lines[y_value]:
            for p in LINES[line_id].pts:
                all_y_values.append(p.y)
    print(all_y_values)
    all_y_values = [p.y for p in LINES[line_id].pts for line_id in horizontal_lines[y_value] for y_value in y_value_group]
    print(all_y_values)

给出以下输出:

[-0.01447138307529966, 0.22089181280929138, 0.22089181280929138, 0.19409634248390767]
---------------------------------------------------------------------------
UnboundLocalError                         Traceback (most recent call last)
<ipython-input-85-62411ee08ee6> in <module>
     24     print(all_y_values)
---> 25     all_y_values = [p.y for p in LINES[line_id].pts for line_id in horizontal_lines[y_value] for y_value in y_value_group]
     26     print(all_y_values)

<ipython-input-85-62411ee08ee6> in <listcomp>(.0)
     24     print(all_y_values)
---> 25     all_y_values = [p.y for p in LINES[line_id].pts for line_id in horizontal_lines[y_value] for y_value in y_value_group]
     26     print(all_y_values)

UnboundLocalError: local variable 'y_value' referenced before assignment

【问题讨论】:

标签: python list-comprehension


【解决方案1】:

有点令人困惑,在列表理解中你应该把外循环放在第一位:

>>> [x for x in y for y in np.random.random((2,2))]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'y' is not defined
>>> [x for y in np.random.random((2,2)) for x in y]
[0.5656047153549479, 0.19139220091114273, 0.10286775868807774, 0.3230695608882298]

所以只需更改顺序:

[
    p.y 
    for y_value in y_value_group
    for line_id in horizontal_lines[y_value]
    for p in LINES[line_id].pts
]

【讨论】:

  • 谢谢..我已经倒退了几个月,几乎惊讶于我之前没有偶然发现这个问题。
猜你喜欢
  • 1970-01-01
  • 2017-05-11
  • 2011-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-13
  • 2021-07-14
  • 1970-01-01
相关资源
最近更新 更多