在Python中生成所有可能映射的列表

时间:2012-08-17 15:59:39

标签: python map set

假设我们有一个映射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 ]

干杯

2 个答案:

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

使用itertools.product

import itertools
K,V = [1,2,3], 'abc'
[dict(zip(K, p)) for p in itertools.product(V, repeat=len(V))]