Python

Pythonのfor文!enumerateで配列のindex取得♪

  • このエントリーをはてなブックマークに追加
  • LINEで送る

Pythonのfor文は配列の要素を取得しながらループできますが、

配列の位置インデックスは簡単に取得できるのでしょうか。

『配列の各要素とインデックス位置を簡単に取得できるの?』

このような疑問に答えます。


SEおっさん
SEおっさん
SE歴20年のオッサンが詳しく解説するぞい!
※保有資格
OracleMasterGold/JavaWebコンポーネントディベロッパ/応用情報技術者/簿記2級/Pythonエンジニア認定データ分析

【Pythonのfor文】enumerateで配列のindex取得!


Pythonのfor文は配列の要素をinで取り出しながらループします。

取得した配列の要素のインデックスの位置が何番目か知りたいケースはどうするのでしょうか。

たろちゃん
たろちゃん
簡単に位置インデックスを取得はないの?

enumerateじゃ!
SEおっさん
SEおっさん

enumerate関数を使うと配列の要素と位置インデックスがとても簡単に取得できます。

書式と例文から見ていきましょう。

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変数にそれぞれ格納しながらループするのです。

【Python】for文とwhileはイテレータで要素を取り出し!
【Python】for文とwhileはイテレータで要素を取り出し!
Pythonのループはfor・while文を使ってループします。 forループの対象と取出し方が今イチわからないアナタへ。 『何を対象にループするの?』 『どう.....

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)の結果のみインデックスが付与された配列に変更されるのです。

ここも重要なポイントじゃ
SEおっさん
SEおっさん



スポンサーリンク

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関数で配列とインデックスを同時に取得しながらループできる

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おっさん
SEおっさん
ここまで読んでくれてありがとう!

プロフィールの詳細はこちら


スポンサーリンク
  • このエントリーをはてなブックマークに追加
  • LINEで送る

コメントを残す

*