3

マッピング 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 ]

乾杯

4

2 に答える 2

6

repeat次の引数を使用しitertools.productます。

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

dict次に、内包表記で s を構築できます。

(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
于 2012-08-17T16:05:12.623 に答える
3

使用itertools.product:

import itertools
K,V = [1,2,3], 'abc'
[dict(zip(K, p)) for p in itertools.product(V, repeat=len(V))]
于 2012-08-17T16:04:36.920 に答える