Pythonのfor文は配列の要素を取得しながらループできますが、
配列の位置インデックスは簡単に取得できるのでしょうか。
『配列の各要素とインデックス位置を簡単に取得できるの?』
こんな疑問に答えます。
【Pythonのfor文】enumerateで配列のindex取得!
Pythonのfor文は配列の要素をinで取り出しながらループします。
取得した配列の要素のインデックスの位置が何番目か知りたいケースはどうするのでしょうか。
enumerate関数を使うと配列の要素と位置インデックスがとても簡単に取得できます。
書式と例文から見ていきましょう。
- 第1引数(必須)
iterable…イテラブルオブジェクト
例)レンジ・リスト・タプル、文字列や辞書など - 第2引数(任意)
start…インデックスの開始値
省略時のデフォルト値…start=0 - 戻り値
第1引数のiterableの各要素をタプル型に変換して先頭にインデックスを付与 - 戻り値の型
enumerateオブジェクト
例文です。
# enumerate関数の例文
x = ["A", "B", "C"]
print(type(enumerate(x)))
print(list(enumerate(x)))
<class 'enumerate'> [(0, 'A'), (1, 'B'), (2, 'C')]
enumerate関数を通ると、
リスト[A, B, C]が、位置インデックスが付与されたリスト[(0, ‘A’), (1, ‘B’), (2, ‘C’)]
になっているのがわかるでしょうか。
また、
enumerate関数の戻り値の型はenumerateオブジェクトです。
printではlistに変換して表示しています。
わかってきた気がする
次はfor文で配列と位置インデックスを取得する例文をみていきましょう。
# enumerate関数のfor文
x = ['A', 'B', 'C']
for i, name in enumerate(x):
print(i, name)
0 A 1 B 2 C
リストの要素を変数name、リストの位置インデックスを変数iに格納してループしていますね。
リストの要素に対応するインデックスは0から付与されています。
また、
for文ではPrintのようにlistへ変換する必要はありません。
enumerateオブジェクトはイテレータを持つイテラブルオブジェクだからです。
enumerate関数は配列(イテラブルオブジェクト)の各要素にインデックスを付与して、新しい配列を作成します。
for文で配列の要素とインデックスを2変数にそれぞれ格納しながらループするのです。
rangeで配列のindexの位置を取得するfor文
enumerateを使わずに、rangeで配列のindexの位置を取得することもできます。
【例文】rangeで配列のindexの位置を取得するfor文
x = ['A', 'B', 'C']
for i in range(len(x)):
print(i, x[i])
0 A 1 B 2 C
配列のインデックス数だけループして、インデックスに対応した配列の要素を表示しています。
これでも確かに配列の要素とインデックスの位置を取得できますが、
ループで配列の要素と同時にインデックスを取得できるenumerate関数の方が簡単で便利ですね。
enumerate関数を使用すると、無駄に変数宣言したり、rangeを使用せずに済みます。
【Python】enumrate関数を深堀り!戻り値と型
enumrate関数の戻り値と型を、もう少し掘り下げて考えてみよう。
x = ['A', 'B', 'C']
print(list(enumerate(x)))
print(list(enumerate(x))[0])
print(type(list(enumerate(x))[0]))
print(x)
[(0, 'A'), (1, 'B'), (2, 'C')] (0, 'A') <class 'tuple'> ['A', 'B', 'C']
リスト[‘A’, ‘B’, ‘C’]の1つ目の要素はAですね。
enumrate関数を通ると、1つ目の要素がタプル(0,A)になっているのがわかるでしょうか?
1つ目の要素Aが、位置インデックスと元々の配列の要素を持つタプル(0,A)となったのです。
配列の要素だけの1次元だった配列がenumrate関数を通ると、タプルでインデックスを付与された2次元配列になります。
また、
タプル化してインデックスを付与した配列は新規生成です。
新規に生成するので、元の配列に影響を及ぼすことはありません。
例の場合ですと…
リスト[“A”, “B”, “C”]が格納された変数xが変更される訳ではありません。
変数xは[“A”, “B”, “C”]のままで、enumerate(x)の結果のみインデックスが付与された配列に変更されるのです。
enumerate関数でインデックスの開始値を指定したfor文
enumerate関数は位置インデックスの開始位置を0以外からスタートさせることができます。
インデックスの開始位置に”2”を指定したenumerate関数の例文です。
print(list(enumerate(x, 2)))
[(2, 'A'), (3, 'B'), (4, 'C')]
インデックスが2で開始されたリスト[(2, ‘A’), (3, ‘B’), (4, ‘C’)]になってますね。
続いて、
enumerate関数でインデックスの開始値を指定したfor文です。
x = ['A', 'B', 'C']
for i, name in enumerate(x, 2):
print(i, name)
2 A 3 B 4 C
リストの要素が変数iでに取りだすと同時に、
リストの要素に対応する位置インデックス2から開始で取り出されていますね。
【Pythonのfor文】まとめ!enumerateで配列のindex取得
いかがでしたでしょうか。
for文でenumerate関数を利用したindex取得方法や普通のfor文の違い
について紹介いたしました。
振り返ってみましょう!
enumerate関数で配列とインデックスを同時に取得しながらループできる
- 引数
第1引数:iterable(イテラブルオブジェクト)
range、リスト・タプル、文字列や辞書など
第2引数:start(インデックスの開始値)
デフォルトはstart=0 - 戻り値
第1引数のiterableの各要素をタプル型に変換して先頭にインデックスを付与 - 戻り値の型
enumerateオブジェクト
x = ["A", "B", "C"]
print(list(enumerate(x)))
print(type(list(enumerate(x))[0]))
print(type(enumerate(x)))
[(0, 'A'), (1, 'B'), (2, 'C')] <class 'tuple'> <class 'enumerate'>
基本が重要ですよ♪
「記事を読んでもわからないトコがある」「内容が変だよ」
という時は、お気軽にコメントください♪
「もっとSEおっさんに詳しく聞きたい。何かお願いしたい!」
という時は、ココナラまで。メッセージもお気軽に♪
LINEでのお問合わせも受付中!
LINE公式アカウント
メッセージをお待ちしています!
- 応用情報技術者
- Oracle Master Gold
- Java SE Gold
- Java EE Webコンポーネントディベロッパ
- Python エンジニア認定データ分析
- 簿記2級