1. ホーム
  2. python

リスト辞書のデカルト積

2023-09-30 16:27:01

質問

たくさんの入力パラメータのデカルト積をテストするためのコードを書こうとしています。

私は見てきました itertools を見ましたが、その product 関数は、私が欲しいものではありません。任意の数のキーを持つ辞書を取るための簡単で明白な方法はありますか? 各値に任意の数の要素を持つ辞書を取得し、次の順列を持つ辞書を生成する簡単で明白な方法はありますか?

入力してください。

options = {"number": [1,2,3], "color": ["orange","blue"] }
print list( my_product(options) )

出力例です。

[ {"number": 1, "color": "orange"},
  {"number": 1, "color": "blue"},
  {"number": 2, "color": "orange"},
  {"number": 2, "color": "blue"},
  {"number": 3, "color": "orange"},
  {"number": 3, "color": "blue"}
]

どのように解決するのですか?

OK、私が間違った場所を探していたことを教えてくれた@dfanに感謝します。私は今それを得ました。

from itertools import product
def my_product(inp):
    return (dict(zip(inp.keys(), values)) for values in product(*inp.values())

EDIT : 何年かの Python の経験の後、より良い解決策は kwargs を受け入れることだと思います。呼び出しのスタイルは、オリジナルの itertools.product . また、ジェネレータ式を返す関数ではなく、ジェネレータ関数を書くことで、より明確なコードになると思います。というわけで。

def product_dict(**kwargs):
    keys = kwargs.keys()
    vals = kwargs.values()
    for instance in itertools.product(*vals):
        yield dict(zip(keys, instance))

と、dictで渡す必要がある場合は list(product_dict(**mydict)) . を使った場合の注目すべき変更点は kwargs を使うことで、少なくとも Python 3.6 までは、キーや値の順序付けができなくなります。