任意の長さのリストの要素の可能なすべての組み合わせ(2^N)を取得します。質問する

任意の長さのリストの要素の可能なすべての組み合わせ(2^N)を取得します。質問する

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)

おすすめ記事