文字列からリストへの辞書を、文字列をそれらのリストの値にマップする辞書のリストに変換するにはどうすればよいですか? たとえば、次の辞書
{'a': [1,2],
'b': ['x', 'y', 'z']}
次のリストに変換されます
[{'a': 1, 'b': 'x'}, {'a': 1, 'b': 'y'}, {'a': 1, 'b': 'z'},
{'a': 2, 'b': 'x'}, {'a': 2, 'b': 'y'}, {'a': 2, 'b': 'z'},]
文字列からリストへの辞書を、文字列をそれらのリストの値にマップする辞書のリストに変換するにはどうすればよいですか? たとえば、次の辞書
{'a': [1,2],
'b': ['x', 'y', 'z']}
次のリストに変換されます
[{'a': 1, 'b': 'x'}, {'a': 1, 'b': 'y'}, {'a': 1, 'b': 'z'},
{'a': 2, 'b': 'x'}, {'a': 2, 'b': 'y'}, {'a': 2, 'b': 'z'},]
ここで必要な主なことは、値の積であり、辞書を再作成することです。実際には、次の助けを借りてこれを簡単に行うことができますitertools.product()
。
>>> from itertools import product
>>> test = {'a': [1, 2], 'b': ['x', 'y', 'z']}
>>> [dict(zip(test.keys(), part)) for part in product(*test.values())]
[{'a': 1, 'b': 'x'}, {'a': 1, 'b': 'y'}, {'a': 1, 'b': 'z'},
{'a': 2, 'b': 'x'}, {'a': 2, 'b': 'y'}, {'a': 2, 'b': 'z'}]
辞書内のすべてのリストの積を作成し、生成された各ペア (または、辞書内の項目が多い場合は、任意の長いタプル) を取得し、辞書内のキーに圧縮します。次に、これをビルトインに渡しdict()
て辞書を作成します。リストをすばやく作成するために、これはすべてリスト内包表記の中にあります。