Pythonでenumerateとzipを同時に使う(複数のリストの要素とインデックスを取得)
Pythonのenumerate関数とzip関数を同時に使う方法について解説します。
Pythonでリストやタプルなどのイテラブルオブジェクトを扱う場合に便利な関数として、enumerate()
関数とzip()
関数があります。
enumerate()
関数は、リストなどのイテラブルから要素とそのインデックスを取り出す関数、zip()
関数は、複数のイテラブル(リストやタプル)から一つずつ要素を取得してセットで返す関数です。それぞれの基本的な使い方は、以下の記事にまとめています。
それぞれの関数の機能を活かし、複数のイテラブル(リストやタプル)からそれぞれ一つずつ要素を取り出しつつ、そのインデックスも取得することができます。
enumerate関数とzip関数を合わせて使う方法
複数のイテラブル(リストやタプル)に対してzip()
関数とenumerate()
関数を同時に使う場合、zip()
関数で各イテラブルを囲んだ後に、enumerate()
関数で囲む形になります。
戻り値の取得に注意が必要で、enumerate()
関数の戻り値(インデックスと要素)となるzip()
関数の要素(複数の要素をまとめたタプル)を展開するために、括弧で囲んでi, (a, b, c, ...)
という形にする必要があります。
# enumerate関数とzip関数を同時に使う
ja = ["りんご", "ごりら", "らっぱ"]
en = ["Apple", "Gorilla", "Trumpet"]
# 要素部分はタプルとして展開する
for i, (j, e) in enumerate(zip(ja, en)):
print(f"{i} - 日本語:{j} <-> 英語:{e}")
# 0 - 日本語:りんご <-> 英語:Apple
# 1 - 日本語:ごりら <-> 英語:Gorilla
# 2 - 日本語:らっぱ <-> 英語:Trumpet
# 3つ以上を展開することも可能
fr = ["Pomme", "Gorille", "Trompette"]
for i, (j, e, f) in enumerate(zip(ja, en, fr)):
print(f"{i} - 日本語:{j} <-> 英語:{e} <-> フランス語:{f}")
# 0 - 日本語:りんご <-> 英語:Apple <-> フランス語:Pomme
# 1 - 日本語:ごりら <-> 英語:Gorilla <-> フランス語:Gorille
# 2 - 日本語:らっぱ <-> 英語:Trumpet <-> フランス語:Trompette
zip()
の要素部分はタプルとして返されるため、上記のようにfor文の記法の中で変数に展開する方法に加えて、タプルとして取得してループ内で使う方法もあります。
# zip関数の要素部分をタプルとしてループ内で使用
ja = ["りんご", "ごりら", "らっぱ"]
en = ["Apple", "Gorilla", "Trumpet"]
for i, t in enumerate(zip(ja, en)):
print(f"{i} - {t}")
# 0 - ('りんご', 'Apple')
# 1 - ('ごりら', 'Gorilla')
# 2 - ('らっぱ', 'Trumpet')
# タプルはループ内で各要素にアクセスできる
for i, t in enumerate(zip(ja, en)):
print(f"{i} - 日本語:{t[0]} <-> 英語:{t[1]}")
# 0 - 日本語:りんご <-> 英語:Apple
# 1 - 日本語:ごりら <-> 英語:Gorilla
# 2 - 日本語:らっぱ <-> 英語:Trumpet