Python 使用递归组合字典中的值

Python 使用递归组合字典中的值,python,dictionary,recursion,Python,Dictionary,Recursion,我有一个包含不同长度列表的字典,我想要一个通用算法来生成列表中所有元素的组合。下面给出了一段示例代码: bob = {'a':['a','b','c'], 'b':[0], 'c':['x','y']} for i in bob['a']: for j in bob['b']: for k in bob['c']: print("%s - %s - %s"%(str(i),str(j),str(k))) 这是特定字典“b

我有一个包含不同长度列表的字典,我想要一个通用算法来生成列表中所有元素的组合。下面给出了一段示例代码:

bob = {'a':['a','b','c'],     
   'b':[0],
   'c':['x','y']}


for i in bob['a']:
    for j in bob['b']:
        for k in bob['c']:
            print("%s - %s - %s"%(str(i),str(j),str(k)))
这是特定字典“bob”的所需输出,它生成以下输出:

a - 0 - x
a - 0 - y
b - 0 - x
b - 0 - y
c - 0 - x
c - 0 - y
但是,我想要一个通用算法。我可以使用递归来概括它,这样它就可以处理具有任意数量键的字典了吗?如果可以,怎么做

额外信息:与键相对应的值始终为1D列表

一般算法为:


使用itertools的产品,非常方便:

>>> from itertools import product
>>> for x in product(*[bob[k] for k in ('a', 'b', 'c')]):
...     print(' - '.join(map(str, x)))
...
a - 0 - x
a - 0 - y
b - 0 - x
b - 0 - y
c - 0 - x
c - 0 - y
如果
bob
键的顺序不相关,可以将其简化为:

>>> for x in product(*bob.values()):
...     print(' - '.join(map(str, x)))

您是否尝试提出自己的解决方案?回答您眼前的问题,是的。这在内存方面不是很有效,因为它将整个乘积扩展为一个元组,而不是使用它是一个生成器的事实。
deque(map(print,itertools.product(*bob.values()),maxlen=0)
如果您想要懒散/内存效率,请使用普通的旧for循环。deque地图打印是不必要的模糊处理。当然是。这是“强制性的一行”:
>>> for x in product(*bob.values()):
...     print(' - '.join(map(str, x)))