Python 名称未在具有多个循环的列表中定义

Python 名称未在具有多个循环的列表中定义,python,list-comprehension,Python,List Comprehension,我试图解包一个复杂的字典,但在使用多个循环的列表理解表达式中,我得到了一个namererror: a={ 1: [{'n': 1}, {'n': 2}], 2: [{'n': 3}, {'n': 4}], 3: [{'n': 5}], } good = [1,2] print [r['n'] for r in a[g] for g in good] # NameError: name 'g' is not defined 你把循环的顺序搞混了;它们被认为是从左到右嵌套的,因此[g]

我试图解包一个复杂的字典,但在使用多个循环的列表理解表达式中,我得到了一个
namererror

a={
  1: [{'n': 1}, {'n': 2}],
  2: [{'n': 3}, {'n': 4}],
  3: [{'n': 5}],
}
good = [1,2]
print [r['n'] for r in a[g] for g in good]
# NameError: name 'g' is not defined

你把循环的顺序搞混了;它们被认为是从左到右嵌套的,因此[g]中r的
是外部循环并首先执行。交换循环:

print [r['n'] for g in good for r in a[g]]
现在为下一个循环定义了
g
,为[g]
中的r定义了
,表达式不再引发异常:

>>> a={
...   1: [{'n': 1}, {'n': 2}],
...   2: [{'n': 3}, {'n': 4}],
...   3: [{'n': 5}],
... }
>>> good = [1,2]
>>> [r['n'] for g in good for r in a[g]]
[1, 2, 3, 4]

@IakovDavydov:这可能有助于思考在使用“传统”的
for
循环执行任务时使用的
for
循环的顺序:列表comp中
for
循环的顺序与传统顺序相同。OTOH,嵌套列表comp的情况有点不同,比如
[[a+z代表a在'abc'中]代表z在'xyz'中]
其中第一个
for
循环(从左到右读取)是内部循环,但这是因为它在内部列表comp中。