使用Python中的生成器在字典中循环
我试图在字典上循环查找所有可能的组合,更具体地说,如果我输入{'a':[1,2],'b':3},我想得到{'a':1,'b':3}和{'a':2,'b':3} 我尝试编写一个递归工作的生成器:使用Python中的生成器在字典中循环,python,Python,我试图在字典上循环查找所有可能的组合,更具体地说,如果我输入{'a':[1,2],'b':3},我想得到{'a':1,'b':3}和{'a':2,'b':3} 我尝试编写一个递归工作的生成器: def loop_dic(dic, head={}): if len(dic) == 0: yield head k = dic.keys()[0] vals = dic[k] dic.pop(k) if not hasattr(vals, '_
def loop_dic(dic, head={}):
if len(dic) == 0:
yield head
k = dic.keys()[0]
vals = dic[k]
dic.pop(k)
if not hasattr(vals, '__iter__'):
vals = [vals]
for v in vals:
_head = head.copy()
_head.update({k:v})
loop_dic(dic, _head)
但它不起作用,因为它得到了GeneratorExit:在第一次递归调用时没有。
如何做到这一点?您所做的就是调用
loop_dic()
;你什么都没做。在Python 3中,您只需执行以下操作:
yield from loop_dic(dic, _head)
在Python 2中,需要一个循环:
for item in loop_dic(dic, _head):
yield item
您所做的就是调用
loop_dic()
;你什么都没做。在Python 3中,您只需执行以下操作:
yield from loop_dic(dic, _head)
在Python 2中,需要一个循环:
for item in loop_dic(dic, _head):
yield item
您是否记得
yield from
?我从未使用过“yield from”,而且我使用的是Python 2.7这也将破坏性地修改dic
,以便在生成器耗尽时它是空的。这真的是你想要的吗?生成器破坏它所迭代的对象是非常不正常的。我修改了代码,在弹出第一个元素之前复制了dictionary对象。它现在可以工作了,但仍然有一大堆代码。你根本不需要pop
。为什么不在不修改的情况下迭代键呢?您是否记得yield from
?我从未使用过“yield from”,而且我使用的是Python 2.7这也会破坏性地修改dic
,以便在生成器耗尽时它是空的。这真的是你想要的吗?生成器破坏它所迭代的对象是非常不正常的。我修改了代码,在弹出第一个元素之前复制了dictionary对象。它现在可以工作了,但仍然有一大堆代码。你根本不需要pop
。为什么不在不修改的情况下重复按键呢?谢谢,在添加\u dic=dic.copy()
和屈服头后的返回后,它现在可以工作了。谢谢,在屈服头后添加\u dic=dic.copy()
和返回后,它现在可以工作了。