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

Iak*_*dov 10 python list-comprehension

我正在尝试解压缩复杂的字典,并且我正在NameError使用多个循环获取列表理解表达式:

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
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 13

你的循环顺序混乱了; 它们被认为是嵌套的由左到右,所以for r in a[g]循环和第一执行.换掉循环:

print [r['n'] for g in good for r in a[g]]
Run Code Online (Sandbox Code Playgroud)

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

>>> 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]
Run Code Online (Sandbox Code Playgroud)

  • @IakovDavydov:在使用"传统"`for`循环执行任务时,可能会考虑使用`for`循环的顺序:list comp中`for`循环的顺序与传统的秩序.OTOH,事情与嵌套列表comp有点不同,例如`[[a + z for a'abc'] for z in'xyz']`其中第一个`for`循环(从左到右阅读)是内部循环,但那是因为它在内部列表comp中. (2认同)