Pythonのfor文はリスト型や辞書型をループ毎に受け取って処理します。
その際にindexも一緒に受け取りたい、と思う人も多いかと思います。
enumerateの基本的な使い方を知りたい
enumerateでリストや辞書のindexを取得したい
といった方に向けて、この記事では、
【基礎】enumerate関数とは
【実践】enumerate関数の使い方
【実践】zip関数とzip_longest関数の使い方
について解説していきます。
enumerateやzipなどはリスト型や辞書型の要素を取得するときに非常に便利ですので、この機会に使い方を理解しておきましょう!
※ この記事のコードはPython 3.7, Ubuntu 18.04で動作確認しました。
なお、Pythonの記事については、こちらにまとめています。
enumerate関数とは
enumerate関数は、for文のループ処理でリスト型や辞書型の要素とindexを同時に取得したい場合に使います。
enumerate関数はこのように引数にindexを取得したいリストを指定します。
enumerate(リストオブジェクト)
ここではenumerate関数を使う前に、for文とvalue、keyの違いについておさらいしておきましょう。
for文の基本的な形はこのようになっています。
for 変数 in シーケンス: 繰り返し処理したいコード
for文についてはこちらの記事で詳しく解説されているのでぜひご覧ください。
また、indexとvalueについても学んでおきましょう。
リスト型では、
mylist = ['apple', 'strawberry', 'watermelon']
という形で要素が格納されています。
この場合、
indexが0のvalueはapple
indexが1のvalueはstrawberry
indexが2のvalueはwatermelon
になります。
辞書型の場合は、indexの変わりに、keyがあります。
辞書型では、
mydict = {1:'apple', 2:'strawberry', 5:'watermelon'}
という形で要素が格納されています。
この場合、
keyが1のvalueはapple
keyが2のvalueはstrawberry
keyが5のvalueはwatermelon
になります。
リスト型と辞書型について詳しく知りたい方は、それぞれこちらの記事をご覧ください。
enumerate関数の使い方
ここからは実際にindexを受け取る方法について見ていきましょう。
enumerate関数はfor文と一緒によく使われます。
こちらのサンプルコードをご覧ください。
X = range(10, 20) for i,v in enumerate(X): print(i,v)
実行結果
0 10 1 11 2 12 3 13 4 14 5 15 6 16 7 17 8 18 9 19
このコードで、Xは10から19までの要素を生成するオブジェクトを持つ変数になります。
for文で使われているenumerate関数は、与えられたシーケンスやイテレータのindexと値を一緒に返してくれる機能があります。
そしてこの関数は(index, value)の組み合わせを、呼び出される度に順々に返してくれます。
後は、このiとvをprint関数で表示することで関数の動きを確認することが出来ます。
また、enumerate関数はもちろんrange関数だけでなく、リストや辞書のような型のシーケンスを同じように扱うことが出来ます。
リストの内容を取得する
ここではリストの内容をenumerate関数で一度に取得する方法を見てみましょう。
こちらのコードをご覧ください。
numbers = [1, 2, 3, 4, 5] for i in enumerate(numbers): print(i)
実行結果
(0, 1) (1, 2) (2, 3) (3, 4) (4, 5)
このようにenumerateでリストを指定すると、indexと値が取得することができます。
indexと値を個別に取得したい場合は、このように指定します。
fruits = ['apple', 'orange', 'banana'] for i, j in enumerate(fruits): print(i,j);
実行結果
0 apple 1 orange 2 banana
このようにリストの値が一度に取得できていることがわかりますね!
辞書の内容を取得する
続いて辞書のサンプルコードを見てみましょう。
X3 = {"taro":"pw1", "hanako":"pw2", "itiro":"pw3","yui":"pw4"} for k,v in enumerate(X3): print(k,v)
実行結果
0 taro 1 hanako 2 itiro 3 yui
辞書型とenumerate関数の組み合わせでは辞書型のkeyを表示しています。
辞書型オブジェクトはfor文に渡すとvalueではなくkeyを返すことに気をつけましょう。
zip関数、zip_longest関数の使い方
zip関数は、複数のリスト型を一度に扱うことが出来る関数です。
詳しくはこちらの記事をご覧ください。
zip関数を使うとリストの要素の数がバラバラでも、数が少ない方のリストに自動的に合わせてくれます。
要素の多いリストに合わせたい場合は、zip_longest関数を使うとよいでしょう。
こちらのサンプルコードを見てみましょう。
from itertools import zip_longest list1 = [1,2,3,4,5,6,7,8,9,10] list2 = ['a','b','c','d','e'] for i,j in zip_longest(list1,list2): print('{0}, {1}'.format(i, j))
実行結果
1, a 2, b 3, c 4, d 5, e 6, None 7, None 8, None 9, None 10, None
zip_longest関数を使うと、要素の多いリストに合わせてタプルが作られます。
対応する要素がない場合は、「None」が含まれます。
zip_logest関数を使うためには、itertoolsという標準モジュールをimportする必要があるので気をつけましょう。
まとめ
この記事では、for文でリストや辞書の各要素だけでなくindexやkeyを返す方法について説明しました。
・enumerate関数はリストや辞書などのシーケンスのindexを受け取るときに使う関数
・zip関数、zip_longest関数は複数のリストを一度に扱うことが出来る関数
ということをぜひ覚えておきましょう。
中でもenumerate関数はとても使用頻度が高い関数だと思うので、ぜひ使ってみてください。