嵌套python理解中的“Name * not defined”

时间:2015-12-28 11:37:52

标签: python python-3.x dictionary iterator generator

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

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

有什么问题?我该怎么办?

3 个答案:

答案 0 :(得分:3)

撤消订单以便解析名称:

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

答案 1 :(得分:1)

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

这有效:

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)

答案 2 :(得分:0)

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.