假设我们有一个映射K - > V,其中域K是一组([1,2,3]),共域V是从集合中得出的(['a','b','c'])。是否有一种简洁的方法可以枚举为可迭代(理想情况下是字典的列表或生成器),所有可能的映射:
例如
[ { 1 : 'a', 2 : 'a', 3 : 'a' },
{ 1 : 'a', 2 : 'a', 3 : 'b' },
{ 1 : 'a', 2 : 'b', 3 : 'a' },
...
{ 1 : 'c', 2 : 'c', 3 : 'c' }
]
请注意,域的大小不固定,因此这种解决方案并不理想:
[ { 1 : x, 2 : y, 3 : z } for x in V for y in V for z in V ]
干杯
答案 0 :(得分:6)
将repeat
参数用于itertools.product
:
K = set([1, 2, 3])
V = set(['a', 'b', 'c'])
itertools.product(V, repeat=len(K))
然后,您可以在理解中构建dict
:
(dict(zip(K, x)) for x in itertools.product(V, repeat=len(K)))
检查:
>>> len([dict(zip([1, 2, 3], x)) for x in itertools.product('abc', repeat=3)])
27
答案 1 :(得分:3)
import itertools
K,V = [1,2,3], 'abc'
[dict(zip(K, p)) for p in itertools.product(V, repeat=len(V))]