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

时间:2018-04-16 16:43:26

标签: python dictionary recursion

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

PyBaseObject_Type

这是特定字典“bob”的理想输出。它产生输出:

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)))

但是,我想要一个通用的算法。我可以使用递归来概括它,以便它可以处理具有任意数量的键的字典,如果是这样的话怎么样?

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

2 个答案:

答案 0 :(得分:8)

一般算法是itertools.product

>>> print(*itertools.product(*bob.values()), sep='\n')
('a', 0, 'x')
('a', 0, 'y')
('b', 0, 'x')
('b', 0, 'y')
('c', 0, 'x')
('c', 0, 'y')

答案 1 :(得分:3)

使用来自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)))