入力リストのすべての可能な組み合わせを含むリストを作成する必要があります。 たとえば、リスト[1,2,3]は[1 [1,2] [1,3] 2 [2,3] 3 [1,2,3]]を返します。 リストは必ずしも任意の特定の順序で。このサイトではitertoolsを使ってたくさんの関数を見つけましたが、リストが必要なときにオブジェクトを返すのです。私はPythonのコーディングの初心者ですので、どんな考えやアイデアも高く評価されます。すべての可能な組み合わせをPythonで作成する
答えて
itertools.combinations
と入力してください。たとえば:
import itertools
lst = [1, 2, 3]
combs = []
for i in xrange(1, len(lst)+1):
combs.append(i)
els = [list(x) for x in itertools.combinations(lst, i)]
combs.append(els)
今combs
はこの値を保持します:
[1, [[1], [2], [3]], 2, [[1, 2], [1, 3], [2, 3]], 3, [[1, 2, 3]]]
はい、それはあなたが提供するサンプル出力はわずかに異なるのですが、その出力には、すべての可能な組み合わせをリストしていませんでした。
何が必要なの単純な組み合わせであれば(それはあなたのサンプル出力に表示される、大きさせずに)私は、これらの他のバージョンを試してみてください、その後、前に各サイズの実際のリストを組み合わせのサイズを一覧表示していますコード:itertoolsモジュールの戻りイテレータから
[[1], [2], [3], [1, 2], [1, 3], [2, 3], [1, 2, 3]]
機能:
import itertools
lst = [1, 2, 3]
combs = []
for i in xrange(1, len(lst)+1):
els = [list(x) for x in itertools.combinations(lst, i)]
combs.extend(els)
今combs
はこの値を保持します。これらをリストに変換するために必要なのは、結果としてlist()
です。
しかし、itertools.combinations
を3回(1回の長さごとに)呼び出す必要があるため、list.extend
を使用して、最終リストにイテレータのすべての要素を追加することができます。
次のことを試してみてください。
import itertools
in_list = [1, 2, 3]
out_list = []
for i in range(1, len(in_list)+1):
out_list.extend(itertools.combinations(in_list, i))
やリストの内包表記のように:
out_list = [c for i in range(len(in_list)) for c in itertools.combinations(in_list, i+1)]
これらの次のリストになります:あなたがリストの代わりにタプルをしたい場合は
[(1,), (2,), (3,), (1, 2), (1, 3), (2, 3), (1, 2, 3)]
単一の長さのタプルを単なる値に変換するには、次のようにします。
out_list = [x[0] if len(x) == 1 else list(x) for x in out_list]
# [1, 2, 3, [1, 2], [1, 3], [2, 3], [1, 2, 3]]
やリストなどの単一の項目を残して:あなたは、ループの内側にitertools.combinations
を使用して、あなたの問題を解決することができ
私はこれを使用しようとしましたが、 NoneTypesでiterを使用しないでください。 – Charles
両方のソリューションがまだタプルのリストを返しています。 – juliomalegria
うん、リストのリストが必要です。タプルはありません。 itertoolsを使用せずに問題を解決する方法はありますか? – Charles
:
>>> l = [1,2,3]
>>> comb = []
>>> for i in range(len(l)):
... comb += itertools.combinations(l,i+1)
...
>>> comb
[(1,), (2,), (3,), (1, 2), (1, 3), (2, 3), (1, 2, 3)]
そして、あなたはリストとしてそれらをしたい場合:
>>> comb_list = [ list(t) for t in comb ]
>>> comb_list
[[1], [2], [3], [1, 2], [1, 3], [2, 3], [1, 2, 3]]
EDIT:組み合わせの最初のパラメータは反復可能であり、2番目のパラメータは結果のタプルの長さです(この場合は1
からlen(l)
になります)。 itertools
モジュールが実際に代わり、リストの発電を返しますが、http://docs.python.org/library/itertools.html#itertools.combinations
:あなたは多数を生成している場合は特に
- ジェネレータは、(多くの場合、リストよりも効率的である組み合わせについて
詳細組み合わせ)
- 本当に必要なときにいつでも
list(...)
を使用して発電機をリストに変換できます。
itertools
作業ものchain
とcombinations
機能は、しかし、あなたはのPython 2.6以降を使用する必要があります。
import itertools
def all_combinations(any_list):
return itertools.chain.from_iterable(
itertools.combinations(any_list, i + 1)
for i in xrange(len(any_list)))
あなたがそのようなとしてこれを呼び出すことができます。
# as a generator
all_combinations([1,2,3]) # --> <itertools.chain at 0x10ef7ce10>
# as a list
list(all_combinations([1,2,3])) # --> [(1,), (2,), (3,), (1, 2), (1, 3), (2, 3), (1, 2, 3)]
# as a list of lists
[list(l) for l in all_combinations([1,2,3])] # --> [[1], [2], [3], [1, 2], [1, 3], [2, 3], [1, 2, 3]]
以前にジェネレータを使用していない場合は、ジェネレータをループのようにループしていることに注意してくださいこのようなトン、:
# a generator returned instead of list
my_combinations = all_combinations([1,2,3])
# this would also work if `my_combinations` were a list
for c in my_combinations:
print "Combo", c
"""
Prints:
Combo (1,)
Combo (2,)
Combo (3,)
Combo (1, 2)
Combo (1, 3)
Combo (2, 3)
Combo (1, 2, 3)
"""
パフォーマンスの差は劇的なことができます。パフォーマンスを比較する場合は、発電機を作成するためにはるかに高速であることがわかります:それはまだいずれの場合も、すべての組み合わせを反復処理するためにいくつかの時間がかかるだろうが、それは大きなことができることを
# as a generator
all_combinations(range(25)) # timing: 100000 loops, best of 3: 2.53 µs per loop
# as a list
list(all_combinations(range(25))) # timing: 1 loops, best of 3: 9.37 s per loop
注意を早くあなたが探しているものを見つけるならば、特にあなたのために勝ちなさい。
l = [1,2,3]
combs = reduce(lambda x, y: list(itertools.combinations(l, y)) + x, range(len(l)+1), [])
オンライナーが必要な場合。
- 1. Python: "dynamic"リストのすべての可能な組み合わせ
- 2. すべての可能な文字列の組み合わせ
- 3. 可能なすべての組み合わせのループ
- 4. すべての可能な組み合わせnセット
- 5. は、すべての可能な組み合わせに
- 6. Pythonで可能なイメージの組み合わせ
- 7. デキューと再帰を使用してすべての可能な組み合わせを作成するC++
- 8. 可能なすべての値の組み合わせを取得する
- 9. 可能な組み合わせとループ
- 10. 可能な文字列の組み合わせのリストを作成する
- 11. 可能なすべての単語の組み合わせを取得
- 12. ggplot2:可能なすべての変数の組み合わせの散布図
- 13. SQLで可能なすべてのデータの組み合わせを生成する方法は?
- 14. すべての組み合わせを生成するバックトラッキングアルゴリズム
- 15. すべての組み合わせツリーアルゴリズム
- 16. Python - ファイルからの行 - すべての組み合わせ
- 17. すべての文字の組み合わせを生成
- 18. MySQLユニークな列の組み合わせを作成する
- 19. 2つの外部キーからすべての可能な組み合わせを生成
- 20. 帰りのルートの組み合わせ数は可能です
- 21. 例外と組み合わせてクラスを作成する
- 22. データウェアハウス:冗長な組み合わせの組み合わせ
- 23. javascriptですべての組み合わせを見つける
- 24. 機能を組み合わせる
- 25. Javaのブール式ツリー内のすべての可能な組み合わせを見つける
- 26. 可能なすべての行の組み合わせをテストしてください
- 27. データフレームの列と行のすべての可能な組み合わせを繰り返します。
- 28. 可能なすべての組み合わせを作成するための効率的なアルゴリズムとは何ですか?
- 29. Smalltalkのコレクションからすべての組み合わせを生成する
- 30. 2次元リストからアイテムの可能な組み合わせをすべて得る方法
を使用してitertoolsコマンドをインポートしました>>> from itertools import * 私のインタプリタは、itertoolsが定義されていないと伝えています。 すべての簡単な質問をお詫び申し上げますが、私はPythonとプログラミングの一般的な新機能です。 – Charles
これはOPが尋ねたものではありません。 – juliomalegria
@ julio.alegriaはい、それはOPが尋ねたものです、私はちょうど私の答えを編集しました –