各ビンに少なくとも1つのアイテムが含まれるように、N個のアイテムのコレクションのすべてのパーティションをK個のビンに生成するアルゴリズム(またはストレートPythonコード)を提供します。順序が重要な場合と順序が重要でない場合の両方でこれが必要です。
順序が重要な例
>>> list(partition_n_in_k_bins_ordered((1,2,3,4), 2))
[([1], [2,3,4]), ([1,2], [3,4]), ([1,2,3], [4])]
>>> list(partition_n_in_k_bins_ordered((1,2,3,4), 3))
[([1], [2], [3,4]), ([1], [2,3], [4]), ([1,2], [3], [4])]
>>> list(partition_n_in_k_bins_ordered((1,2,3,4), 4))
[([1], [2], [3], [4])]
順序が重要でない例
>>> list(partition_n_in_k_bins_unordered({1,2,3,4}, 2))
[{{1}, {2,3,4}}, {{2}, {1,3,4}}, {{3}, {1,2,4}}, {{4}, {1,2,3}},
{{1,2}, {3,4}}, {{1,3}, {2,4}}, {{1,4}, {2,3}}]
これらの関数は、リストではなく、遅延イテレータ/ジェネレータを生成する必要があります。理想的には、にあるプリミティブを使用しitertools
ます。私を逃れている賢い解決策があるのではないかと思います。
Pythonでこれを要求しましたが、明確なアルゴリズムを翻訳することもできます。