2012-08-17 68 views
3

假設我們有一個映射K - > V,其中域K是一個集合[[1,2,3]),共域V是繪製的從集合(['a','b','c'])。有沒有一種簡潔的方式來枚舉作爲一個迭代(理想情況下,一個列表或字典發生器),所有可能的映射:在Python中生成所有可能映射的列表

例如。

[ { 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 ] 

乾杯

回答

3

使用itertools.product

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

使用參數itertools.productrepeat

K = set([1, 2, 3]) 
V = set(['a', 'b', 'c']) 
itertools.product(V, repeat=len(K)) 

然後,您可以構建dict S IN一個理解:

(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 
相關問題