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

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

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

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

Python

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

Q&A

解決済

2回答

1481閲覧

Pythonでfor文を使ってリストを表示したい

Ykkykk

総合スコア140

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2018/09/05 02:27

Pythonでfor文を回し、リストの要素を取得したいです。

Pandasを使用してCSVファイルから二列の値を取り出し、それらをタプル型の座標に格納したリストから、for文を使用して値を取り出していきたいのですが、空のリストが返されてしまいます。

Python

1>>import pandas as pd 2>>df = pd.read_csv('File.csv') 3 4>>x = list(df[1]) 5>>y = list(df[2]) 6>>coor = zip(x, y) 7 8>>print(list(coor)) 9>>[(1,2),(3,4),……,(10,20)] 10 11>>for z in coor: 12>> print(z)

以上のようにしてcoorという変数に、タプル型の座標のリストを格納しました。
そこからfor文を使用して変数zに値を取り出していきたいと思ったのですが、何も表示されませんでした。
そこで、

Python

1>>print(list(coor)) 2>>[]

として、coorの中身を確認してみたところ、空の配列が返ってきました。
なぜ配列は空になってしまったのでしょうか?また、変数zにfor文でcoorの中身を取り出していくことはできないのでしょうか?
ご教示くださいますと幸いです。
よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

ジェネレータ (より一般的にはイテレータ) は一度巡回すると消費されます。

Python

1>>> a = [1, 2, 3, 4, 5] 2>>> b = [5, 4, 3, 2, 1] 3>>> 4>>> gen = zip(a, b) 5>>> 6>>> list(gen) 7[(1, 5), (2, 4), (3, 3), (4, 2), (5, 1)] 8>>> list(gen) 9[]

何回も使いたいようなら、リスト化して変数に代入してやってください。

Python

1>>> gen = zip(a, b) 2>>> lst = list(gen) 3>>> 4>>> lst 5[(1, 5), (2, 4), (3, 3), (4, 2), (5, 1)] 6>>> lst 7[(1, 5), (2, 4), (3, 3), (4, 2), (5, 1)]

追記

ジェネレータは一度巡回すると消費されます。

上記記述自体は誤りではないですが、ジェネレータ というより イテレータ 一般の仕様です。
本来は ジェネレータとイテレータ ではなく、イテレータとイテラブル を対比すべきところでした。

iterator

データの流れを表現するオブジェクトです。イテレータの __next__() メソッドを繰り返し呼び出す (または組み込み関数 next() に渡す) と、流れの中の要素を一つずつ返します。データがなくなると、代わりに StopIteration 例外を送出します。その時点で、イテレータオブジェクトは尽きており、それ以降は __next__() を何度呼んでも StopIteration を送出します。...中略... (list のような) コンテナオブジェクトは、自身を iter() 関数にオブジェクトに渡したり for ループ内で使うたびに、新たな未使用のイテレータを生成します。これをイテレータで行おうとすると、前回のイテレーションで使用済みの同じイテレータオブジェクトを単純に返すため、空のコンテナのようになってしまします。

引用元: Pythonドキュメント » 用語集

私自身、回答にあたって若干混乱したようです。失礼しました。

Python

1>>> # これは イテラブル 2... lst = [1, 2, 3, 4, 5] 3>>> 4>>> list(lst) 5[1, 2, 3, 4, 5] 6>>> list(lst) 7[1, 2, 3, 4, 5] 8>>> 9>>> # これは イテレータ 10... it = iter(lst) 11>>> 12>>> list(it) 13[1, 2, 3, 4, 5] 14>>> list(it) 15[]

投稿2018/09/05 02:34

編集2018/09/05 03:54
LouiS0616

総合スコア35660

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

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

Ykkykk

2018/09/05 02:38

ご回答いただきありがとうございます。 「消費される」というのはどういうことなのでしょうか? 再度お教え頂ければ、と思います。
tachikoma

2018/09/05 02:40

本筋と外れて申し訳ないのですが、zipで作られるオブジェクトはイテレータではなくジェネレータと呼ぶんでしょうか。
LouiS0616

2018/09/05 02:51

@Ykkykk さん 『Qiita - Pythonのイテレータとジェネレータ』https://qiita.com/tomotaka_ito/items/35f3eb108f587022fa09 が参考になるかもしれません。 ただし、『消費される』という表現は私がなんとなく選んだもので、ドキュメントなどの正式な表現ではありません。 @tachikoma さん ジェネレータイテレータなのではないかと。 まあただ当該挙動は一般のイテレータでも見られるので、断定はできないですね。 ちょっと調査してみます。
LouiS0616

2018/09/05 03:16

@tachikoma さん ドキュメントのzipの項( https://docs.python.jp/3/library/functions.html#zip )を見ると、等価な関数としてジェネレータ関数が紹介されています。 さらに用語集( https://docs.python.jp/3/glossary.html#term-generator )に従えば、『zipの返す値はジェネレータイテレータである』と断定して良さそうです。 ジェネレータイテレータはイテレータに内包されますから、『zipは呼び出すとジェネレータを返す』も『zipは呼び出すとイテレータを返す』も真です。
tachikoma

2018/09/05 04:24 編集

今回のはイテレータの振舞いだったと思うので少し気になって質問しました。(ジェネレータイテレータとイテレータは振舞いが同じで、実装以外の違いを私自身よく分かってないのです。)どうもありがとうございました。
LouiS0616

2018/09/05 04:48

こちらとしても回答を検証する良い機会になりました。ありがとうございました。
Ykkykk

2018/09/05 04:49

お二方のやりとりが大変勉強になりました。 ありがとうございます!
guest

0

ベストアンサー

zip()が返すイテレータは一回しかループを回せないので、for文以外で使うのは避けたほうがいいですね。

Python

1for z in zip(x, y): 2 print(z)

もしくは下記でもいいです。

Python

1coor = list(zip(x, y)) 2

投稿2018/09/05 02:35

tachikoma

総合スコア3601

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

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

Ykkykk

2018/09/05 02:39

ご回答いただきありがとうございます。 初めて知りました。勉強になりました。 ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問