使用Python中的生成器在字典中循环

使用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, '_

我试图在字典上循环查找所有可能的组合,更具体地说,如果我输入{'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, '__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()
返回后,它现在可以工作了。