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中。