20

私はpythonが初めてで、複数のリストの組み合わせを形成するのに苦労しています。だから、私は次のように見える3つ(そしておそらくそれ以上)を持っています:

uk_rock_stars=[1,2,3,4,5,6,7,8,9]
uk_pop_stars=[10,11,12,13,1,4,6,22,81]
us_stars=[22,34,44,7,33,99,22,77,99]
.
.

すべてのリストが同じ長さです。ここで、それらの組み合わせリストを生成したいと思います。N は上記のリストの総数です。次のような結果を探しています。

comb=[(1,10,22),(1,10,34),(1,10,44)...etc (all combinations)....]

各組み合わせ、たとえば (1,10,22) は、元のリストの数 (この場合は 3) と同じ長さになります。

4

2 に答える 2

30

このhttp://docs.python.org/2/library/itertools.html#itertools.productを読んでください。すべてが説明されています。

itertoolsコレクションを反復処理するための便利な機能を多数備えたパッケージです。便利な機能の 1 つは、product与えられた反復可能なコレクションのデカルト積を反復処理するジェネレーターを作成する関数です。

の結果はitertools.productリストではなく、ジェネレーターです。Python ジェネレーターは、他の言語のコルーチンに似ています。これは、必要に応じて組み合わせを計算することを意味します。それぞれのサイズが 100 の 3 つの iterable の積を計算するが、最初の 10 程度しか使用しない場合、itertools.product100^3 の組み合わせをすべて計算するのではなく、10 の組み合わせしか計算しません。

実際にジェネレーターの代わりにリスト オブジェクトが必要な場合 (スライスなどを計算したい場合)、list関数を呼び出して、ジェネレーター オブジェクトを引数として渡します。

次のコードは、すべての組み合わせを生成し、結果を出力します。

コード:

import itertools

uk_rock_stars=[1,2,3,4,5,6,7,8,9]
uk_pop_stars=[10,11,12,13,1,4,6,22,81]
us_stars=[22,34,44,7,33,99,22,77,99]

for combination in itertools.product(uk_rock_stars, uk_pop_stars, us_stars):
    print combination

出力:

(1, 10, 22)
(1, 10, 34)
(1, 10, 44)
(1, 10, 7)
(1, 10, 33)
(1, 10, 99)
(1, 10, 22)
(1, 10, 77)
(1, 10, 99)
(1, 11, 22)
(1, 11, 34)
(1, 11, 44)
(1, 11, 7)
(1, 11, 33)
(1, 11, 99)
(1, 11, 22)
(1, 11, 77)
(1, 11, 99)
...
etc.
于 2013-03-09T00:44:40.127 に答える
5

これがあなたが探しているものだと思います:

import itertools
comb = itertools.product(uk_rock_stars, uk_pop_stars, us_stars)

それはあなたが望むものかもしれないし、そうでないかもしれないイテレータオブジェクトをあなたに与えるでしょう。通常のリストに変換するには、次のようにします。

comb = list(comb)
于 2013-03-09T00:38:15.893 に答える