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

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

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

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

Q&A

解決済

3回答

387閲覧

Python3でenumerate関数が取得するインデックスは、関数の引数として指定したリストのインデックスなのですか?

carbie

総合スコア15

Python

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

0グッド

0クリップ

投稿2019/01/12 19:11

編集2019/01/26 15:31

Python3のenumerate関数について解説されているいろいろなwebページを読みますと、
以下のような感じに書かれています。

すなわち、
enumerate関数はリストの要素とともにインデックスを取得する関数であり、
for 変数(1), 変数(2) in enumerate(リスト):
という形でforループとともに用いられることが多く、
変数(1)にはリストのインデックスが、
変数(2)にはリストの要素が、
各々取得される。

とのことなのですが、
変数(1)には、本当にリストのインデックスが取得されるのでしょうか?

といいますのは、

list001 = ['red', 'green', 'yellow', 'blue', 'purple']
for i, color in enumerate(list001[1:4]):
print(i, color)

このコードを実行しますと、

0 green
1 yellow
2 blue

という実行結果が出ます。

enumerate関数の第二引数を何ら指定していませんので、
もしリスト「list001」のインデックスが出力されるのでしたら、

1 green
2 yellow
3 blue

となるはずではありませんか?

enumerate関数の上記変数(1)には、リストのインデックスではなく、
enumerate関数が新たに付与するインデックスが取得されるのではないのでしょうか?

私は超初心者なので、どこかに勘違いがあると思うのですが、
どうにも理解できず、困っています。
どうぞ、よろしくお願い致します。

##【その後の報告】##

改めまして、can110さん、LouiS0616さん、katoyさん、ご回答ありがとうございました。
質問してから少し時間が経ってしまいましたが、
頂いたご回答からとても理解が深まりました。

ところで、ご回答をすぐにつけてくださったcan110さんのアドバイスに感動して即座にベストアンサーとしていましたが、
質問タイトルとの兼ね合いで、仮にここを参考になさる方があった場合を考えて、
より直接的なご回答をつけてくださったLouiS0616さんのご回答にベストアンサー変更とさせていただきます。

そのうち私もご回答者の方々のようなPython使いになりたいと勉強しております。
どうぞ、今後ともよろしくお願い致します。

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

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

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

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

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

guest

回答3

0

ベストアンサー

enumerate関数はリストの要素とともにインデックスを取得する関数

それはかなり誤魔化した表現で、実際とは異なります。

Python

1>>> lst = [1, 2, 3] 2>>> for i, v in enumerate(lst): 3... print(i, v) 4... 50 1 61 2 72 3 8>>> 9>>> for i, v in enumerate(lst, start=10): 10... print(i, v) 11... 1210 1 1311 2 1412 3 15>>> 16>>> for i, v in enumerate(lst, start=-100): 17... print(i, v) 18... 19-100 1 20-99 2 21-98 3

付与できるのはインデックスというより、任意の整数値からのカウントです。
デフォルトの起点0を用いた場合に、インデックスと一致するだけなのです。


また、巡回する対象はイテラブルであってリストとは限らないです。

Python

1>>> for i, v in enumerate('spam'): 2... print(i, v) 3... 40 s 51 p 62 a 73 m

投稿2019/01/13 00:50

LouiS0616

総合スコア35658

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

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

carbie

2019/01/13 05:34

LouiS0616さん、ありがとうございますm(_'_)m なるほど、そうでしたか。。 lst = [1, 2, 3, 4, 5] for i, v in enumerate(lst, 10): print(i, v) # 10 1 # 11 2 # 12 3 # 13 4 # 14 5 このコードで、enumerate()が取得するインデックスが何なのか、について、 1) lstのインデックスを取得したうえで、そのインデックスに10を足したもの 2) emunerate()自体が新たに付与したもの のいずれなのかが知りたくて、 for i, color in enumerate(lst[1:4]): 今回私はこれをやってみたのでした。 そうしたら、確かめるための方法であったはずの lst[1:4]の意味を取り間違っていたことが、can110さんのご指摘で分かったところでした。 なるほど、インデックスはenumerate()自体が行う任意の整数値からのカウントであって、 リスト自体のインデックスを取得しているわけではないのですね。 非常に明快なご回答、ありがとうございます。 お陰様で、頭の緊張がほぐれました。。m(_'_)m
guest

0

list001[1:4]list001とは異なる別の新たなリストと考えてください。
このことは以下のコードで確認できます。

Python

1list001 = ['red', 'green', 'yellow', 'blue', 'purple'] 2print(id(list001)) # 1528433117960 3print(id(list001[1:4]))# 1528433118024 上とは異なるリスト 4print(list001[1:4][0]) # green

投稿2019/01/12 19:20

can110

総合スコア38234

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

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

carbie

2019/01/12 19:26

can110さん、ありがとうございます!! 非常によく理解できました!!!m(_'_)m
guest

0

enumerate(list001[1:4]) として呼び出しているので、
enumurate には list001[1:4] の ['green', 'yellow', 'blue'] しか渡りません。
enumurate 処理内部では、 green の index は 0 です。
list001 中では green の index が 1 だったことは、 enumerate 内部では知りようがありません。

for i, color in enumerate(list001[1:4]):
は、
list_sub = list001[1:4]
for i, color in enumerate(list_sub):
と同じです。

投稿2019/01/13 02:23

katoy

総合スコア22324

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

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

carbie

2019/01/13 05:44

katoyさん、ご回答ありがとうございます。 なるほど。。 引数として渡した分だけ関数に認識される、 そして、渡した分というところを、より正確に厳密に自覚しなければならない、 ということなんですね。。 関数の考え方が、非常に勉強になりました。 ありがとうございますm(_'_)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問