Help us understand the problem. What is going on with this article?

Pythonでmapオブジェクトのforループは一度しかできない

こういう事になります。

str_list = ["1", "2", "3"]

int_map = map(lambda i: int(i), str_list)

for i in int_map:
  print("map1回目", i)

for i in int_map:
  print("map2回目", i) #=> ここだけ出力されない

int_list = list(map(lambda i: int(i), str_list))

for i in int_list:
  print("list1回目", i)

for i in int_list:
  print("list2回目", i)

出力

map1回目 1
map1回目 2
map1回目 3
list1回目 1
list1回目 2
list1回目 3
list2回目 1
list2回目 2
list2回目 3

環境

  • python 3.6.9
  • Google Colaboratory

解説

Listオブジェクトは何度でもforでループできます。

int_list = [1,2,3]

for i in int_list:
  print("list1回目", i)

for i in int_list:
  print("list2回目", i)

出力

list1回目 1
list1回目 2
list1回目 3
list2回目 1
list2回目 2
list2回目 3

これを、map()関数のイテレータオブジェクトで行うと、

str_list = ["1", "2", "3"]

int_map = map(lambda i: int(i), str_list)

for i in int_map:
  print("map1回目", i)

for i in int_map:
  print("map2回目", i) #=> ここだけ出力されない

一度めのforしか通りません。

map1回目 1
map1回目 2
map1回目 3

Python公式ドキュメントによると

(list のような) コンテナオブジェクトは、自身を iter() 関数にオブジェクトに渡したり for ループ内で使うたびに、新たな未使用のイテレータを生成します。これをイテレータで行おうとすると、前回のイテレーションで使用済みの同じイテレータオブジェクトを単純に返すため、空のコンテナのようになってしまします。

とのことです。イテレータとしてみると、list等のコンテナオブジェクトの方が特殊な挙動なんですね。

実際に中身を確認してみると

str_list = ["1", "2", "3"]
int_map = map(lambda i: int(i), str_list)

for i in int_map:
  print("map1回目", i)

print(list(int_map))
map1回目 1
map1回目 2
map1回目 3
[]

forを通った後の中身は空になっていました。

ちなみに、forだけでなくlist()を一度でも呼ぶと空になります。

str_list = ["1", "2", "3"]
int_map = map(lambda i: int(i), str_list)

print(list(int_map))

for i in int_map:
  print("map1回目", i) #=> ここは出力されない
[1, 2, 3]
suzuki_sh
Windowsでコンピュータの世界が広がります
https://www.s2terminal.com
finergy-a-tm
大阪府大阪市北区角田町8番1号 梅田阪急ビル オフィスタワー35F
https://finergy.a-tm.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away