15 個の数字のリストがあります。これらの数字の 32,768 通りの組み合わせ (つまり、元の順序で任意の数の要素) をすべて生成するにはどうすればよいでしょうか。
10 進整数 1 ~ 32768 をループし、各数値の 2 進表現をフィルターとして使用して、適切なリスト要素を選択することを考えました。もっと良い方法はありますか?
特定の長さの組み合わせについては、長さnのすべての(nからkを選ぶ)組み合わせを取得します。適切な場合は、代わりにその質問を使用して重複を閉じてください。
組み合わせ論に関する質問を重複として閉じる場合、質問者が問題を説明するために使用された言葉ではなく、実際に何を求めているかを確認することが非常に重要です。たとえば、デカルト積(複数のリストの直積を取得する方法)に「組み合わせ」について質問します。
ベストアンサー1
この答え1 つの側面が見逃されています: OP は長さ "r" の組み合わせだけではなく、すべての組み合わせを要求しました。
したがって、すべての長さ「L」をループする必要があります。
import itertools
stuff = [1, 2, 3]
for L in range(len(stuff) + 1):
for subset in itertools.combinations(stuff, L):
print(subset)
あるいは、もっと派手にしたい場合 (または、あなたの後にコードを読む人の脳を混乱させたい場合) は、「combinations()」ジェネレーターのチェーンを生成し、それを反復処理することができます。
from itertools import chain, combinations
def all_subsets(ss):
return chain(*map(lambda x: combinations(ss, x), range(0, len(ss)+1)))
for subset in all_subsets(stuff):
print(subset)