※こちらの記事は、プロスタ編集部が現在大変人気の高いPythonの文法記事を公開することで、皆様の学習にお役に立ちたい意図で投稿しております。
参考サイト:【Python入門】for文でデータのindexを取得する方法
#【Python入門】for文でデータのindexを取得する方法
Pythonでは、for文を用いることでさまざまなデータの集まりから、ひとつずつ順番にデータを取り出す事が出来ます。しかし、時にはデータだけでなくそのデータのインデックスを取り出したい時があります。
今回は、for文でデータのインデックスを取得する方法とその応用について説明します。
目次 [非表示]
1 リストを使ったfor文でインデックスを取得する
1.1 rangeを使った方法
1.2 enumerateを使った方法
2 2つのリストを平行にループする
2.1 rangeを使う
2.2 enumerateを使う
2.3 zip関数を使う
##リストを使ったfor文でインデックスを取得する
for文の中でも、特にリストやタプルを使うfor文では、そのインデックスを利用したい時があります。そこで、Pythonのfor文には取り出している要素のインデックスを取り出す方法が用意されています。
##rangeを使った方法
Pythonのfor文ではrange関数を使ってループをするのが一般的ですが、そのrangeを使ってインデックスを取り出す事が出来ます。
list = ['python', 'Hello', 'world']
for i in range(len(list)):
list_item = list[i]
print('{0}:{1}'.format(i, list_item))
リストから直接データを取り出すのではなく、 len()関数でリストの長さを取り出し、その分だけループを回します。すると、その時の変数1の値がインデックスとなりますので、for文内でそのインデックス番目の要素を取り出して別の変数に格納し、最後に一緒に出力しています。
この方法でもちゃんとインデックスを取り出せます。しかし、少し読みづらいコードになってしまいますね。それに、リストの要素を取り出すのがメインなのに、直接リストでループをしていないのは、違和感を感じます。
list = ['python', 'Hello', 'world']
for i in range(len(list)):
list_item = list[i]
print('{0}:{1}'.format(i, list_item))
実行結果
0:python
1:Hello
2:world
##enumerateを使った方法
さきほどはrangeを使ってインデックスを取り出しましたが、とても読みづらいコードになってしまいました。そこでPythonには、スッキリとしたコードでインデックスを取り出すための関数が用意されています。それがenumerateです。
for 変数1, 変数2 in enumerate(リスト):
print('{0}:{1}'.format(変数1, 変数2))
enumerate関数を使うと、要素のインデックスと要素を同時に取り出す事が出来ます。インデックスが変数1、要素が変数2に格納されます。rangeを使った方法と比べると行数が少なくスッキリとしていて、とても見やすいコードになっています。インデックスを取り出すことは、なるべくenumerate関数を使いましょう。
list = ['python', 'Hello', 'world']
for i, j in enumerate(list):
print('{0}:{1}'.format(i, j))
実行結果
0:python
1:Hello
2:world
###rangeを使う
通常のfor文通り、rangeを使って2つのリストをループすることができます。
for 変数 in rage(len(リスト1)):
print('{0}, {1}'.format(リスト1[変数], リスト2[変数]))
len関数で取りだしたリスト1の長さの分だけループを回します。するとその時の’変数’の値がインデックスと同等なので、各リストの変数番目の要素を取り出せば、2つのリストをループすることができます。
list1 = ['python', 'Hello', 'world']
list2 = ['Python', 'programming', 'beginner']
for i in range(len(list1)):
print('list1:{0}, list2{1}'.format(list1[i], list2[i]))
実行結果
list1:python, list2Python
list1:Hello, list2programming
list1:world, list2beginner
ちゃんと2つのリストでループを回し、両方の要素を出力できています。しかし、rangeを使った方法では、やはり読みづらいコードになっていますね。
###enumerateを使う
次に、考えられるのが、さきほどのenumerateを使う方法です。
for 変数1, 変数2 in enumerate(リスト1):
print(‘{0}, {1}'.format(変数2, リスト2[変数1]))
enumerate関数では、取り出した要素のインデックスを取り出す事が出来ます。それを利用することで、リスト2の要素を取り出しています。rangeを使うよりはコードも短くなりマシに見えますが、2つの変数をバラバラに使うので、見づらいですしこんがらがってしまいそうですね。
list1 = ['python', 'Hello', 'world']
list2 = ['Python', 'programming', 'beginner']
for i,j in enumerate(list1):
print('list1:{0}, list2:{1}'.format(j, list2[i]))
実行結果
list1:python, list2:Python
list1:Hello, list2:programming
list1:world, list2:beginner
###zip関数を使う
rangeおよびenumerateを使って2つのリストをループする方法は、見づらいだけではなく、もう一つ問題があります。それは、2つのリストの長さが違う場合、エラーになることがあります。
list1 = ['python', 'Hello', 'world', 'test']
list2 = ['Python', 'programming', 'beginner']
for i,j in enumerate(list1):
print('list1:{0}, list2:{1}'.format(j, list2[i]))
実行結果
print(‘list1:{0}, list2:{1}’.format(j, list2[i]))
IndexError: list index out of range
この例では、list1が長さ4なので、ループを4回繰り返します。しかし、list2は長さが3なので、これではループの4回目に要素の参照ができないため、エラーになります。つまり、rangeおよびenumerateを使う場合はリストの長さを考慮しないといけないので、少し煩わしいです。
コードの読みづらさとリストの長さを考慮しないといけない問題を解決するために、2つのループを回すときは、zip関数を使うのが良いでしょう。
for 変数1, 変数2 in zip(リスト1, リスト2):
print('{0}, {1}'.format(変数1, 変数2))
zip関数を使うと、2つ以上のリストから各要素を取り出し、リスト1の要素は変数1へ、リスト2の要素は変数2へ、それぞれ格納してくれます。非常にコードがスッキリして見やすいですね。さらに、リストの長さが違う場合は自動で短いリストの長さに合わせてくれるので、リストの長さをいちいち考える必要もありません。
list1 = ['python', 'Hello', 'world', 'test']
list2 = ['Python', 'programming', 'beginner']
for i, j in zip(list1, list2):
print('{0}, {1}'.format(i,j))
実行結果
python, Python
Hello, programming
world, beginner