我在这种形式的词典中收集了信息:
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
有什么问题?我该怎么办?
答案 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.