53

配列のリストがあり、配列内の要素のデカルト積を取得したいと考えています。

これをより具体的にするために例を使用します...

itertools.product はそのトリックを行うようですが、私は少し詳細にこだわっています。

arrays = [(-1,+1), (-2,+2), (-3,+3)];

私が行った場合

cp = list(itertools.product(arrays));

私は得る

cp = cp0 = [((-1, 1),), ((-2, 2),), ((-3, 3),)]

でも手に入れたいのは

cp1 = [(-1,-2,-3), (-1,-2,+3), (-1,+2,-3), (-1,+2,+3), ..., (+1,+2,-3), (+1,+2,+3)].

私はいくつかの異なることを試しました:

cp = list(itertools.product(itertools.islice(arrays, len(arrays))));
cp = list(itertools.product(iter(arrays, len(arrays))));

彼らは皆、 cp1の代わりにcp0をくれました。

何か案は?

前もって感謝します。

4

3 に答える 3

67
>>> list(itertools.product(*arrays))
[(-1, -2, -3), (-1, -2, 3), (-1, 2, -3), (-1, 2, 3), (1, -2, -3), (1, -2, 3), (1, 2, -3), (1, 2, 3)]

これにより、すべてのペアが個別の引数として に供給されproduct、それらのデカルト積が得られます。

バージョンが機能しない理由は、product引数を 1 つしか指定していないためです。1 つのリストのデカルト積を求めるのは自明なケースであり、1 つの要素 (引数として指定されたリスト) のみを含むリストを返します。

于 2010-06-13T21:38:40.943 に答える
40
>>> arrays = [(-1,+1), (-2,+2), (-3,+3)]
>>> list(itertools.product(*arrays))
[(-1, -2, -3), (-1, -2, 3), (-1, 2, -3), (-1, 2, 3), (1, -2, -3), (1, -2, 3), (1, 2, -3), (1, 2, 3)]
于 2010-06-13T21:41:14.090 に答える