質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

2回答

1633閲覧

itertools.productとlistの仕様

horiegom

総合スコア152

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/12/21 04:32

python 3.7

itertools.productをリストに変換する場合、

python

1x = [1,2,3] 2y = [4,5] 3 4prod_ = itertools.product(x,y) 5prod_list = list(prod_) 6 7#1 8print(prod_list) 9#2 10print(list(prod_)) 11#3 12print([prod_]) 13 14

上記3パターンで出力が異なる理由を知りたい

#1 >>[(1, 4), (1, 5), (2, 4), (2, 5), (3, 4), (3, 5)] #2 >>[] #3 >>[<itertools.product object at 0x000002060C313098>]

以下の内包表記においても同様

[print(i) for i in prod_list ] [print(i) for i in list(prod_)]

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

まずは、3. について
itertoolなどで生成されるシーケンスは、generatorになっているものが多いです。このpred_に入っているオブジェクトもgeneratorです。
generatorはfor文やlist関数などで実体化させることができます。
実体化する前は未計算の状態なので、不要な計算を抑制したり、無限のシーケンスが扱えるなどの利点があります。

1 でprod_lisに入っているのは、prod_がlist関数で実体化されたリストです。

2 で値が入らないのは、generatorがすでに回り切ってしまってもう何も生成することができないからです。
最後まで行ってしまったということです。
以下のおうに逆にしてみるとわかるかもしれません。

python

1print(list(prod_)) 2 3prod_list = list(prod_) 4print(prod_list)

投稿2021/12/21 04:49

編集2021/12/21 04:51
TakaiY

総合スコア13792

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

itertools.product(x,y)のようなものをイテレータと呼びます。
イテレータ型のオブジェクトは__next__というメソッドを持っています。

python

1>>> prod_.__next__ 2<method-wrapper '__next__' of itertools.product object at 0x000001BC7C6F9040>

イテレータは組込み関数nextを使って「次のアイテム」を返します。

ご質問に対する回答は、itertools.productの仕様というよりも「イテレータ」一般の仕様です。

多くのイテレータがあり、同じような動きをします。

例: list型から生成されるiter

python

1>>> iter_ = iter(['a', 'b', 'c']) 2>>> iter_list = list(iter_) 3>>> #1 4>>> print(iter_list) 5['a', 'b', 'c'] 6>>> #2 7>>> print(list(iter_)) 8[] 9>>> #3 10>>> print([iter_]) 11[<list_iterator object at 0x000001BC7C7F3130>]

例: range型から生成されるiter

python

1>>> iter_ = iter(range(5)) 2>>> iter_list = list(iter_) 3>>> #1 4>>> print(iter_list) 5[0, 1, 2, 3, 4] 6>>> #2 7>>> print(list(iter_)) 8[] 9>>> #3 10>>> print([iter_]) 11[<range_iterator object at 0x000001BC7C726F90>]

投稿2021/12/21 06:49

ppaul

総合スコア24670

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問