"Name * not defined" 在嵌套 python 理解中

"Name * not defined" in nested python comprehension

我在这种形式的词典中收集了信息:

dico = {
        'key1': ('el1', 'el2', 'el3'),
        'key2': ('el4',),
        'key3': ('el5', 'el6'),
        }

我希望以这样的方式迭代它:

>>> for i in gen:
...    print(i)
('key1', 'el1')
('key1', 'el2')
('key1', 'el3')
('key2', 'el4')
('key3', 'el5')
('key3', 'el6')

所以我是这样构建的 gen:

gen = ((key, value) for value in values for key, values in dico.items())

但这会引发 NameError:

NameError: name 'values' is not defined

怎么了?我该怎么办?

反转顺序以便名称解析:

gen = ((key, value) for (key, values) in dico.items() for value in values)

for 循环的顺序应与您编写的顺序相同:

for key, values in dico.items():
    for value in values:
        yield key, value

您需要按照嵌套顺序从左到右列出循环。你调换了那个订单。

这个有效:

gen = ((key, value) for key, values in dico.items() for value in values)

这与您将这些循环嵌套在生成器函数中的方式相对应:

for key, values in dico.items():
    for value in values:
        yield (key, value)
You have to reverse the order of gen generation code.

dico = {
        'key1': ('el1', 'el2', 'el3'),
        'key2': ('el4',),
        'key3': ('el5', 'el6'),
        }
gen = ((key, value) for (key, values) in dico.items() for value in values)
for i in gen:
    print(i)

>>> ================================ RESTART ================================
>>> 
('key1', 'el1')
('key1', 'el2')
('key1', 'el3')
('key2', 'el4')
('key3', 'el5')
('key3', 'el6')
>>> 

How bellow code is eveluated:
gen = ((key, value) for (key, values) in dico.items() for value in values)

step 1: for (key, values) in dico.items()
step 2: values of step 1 will be input for bellow code:
        for value in values
step 3: then for every value it will store the key, value pair in gen
dictionary.