for文を使うときに値とインデックス番号を同時に取得したいと思ったことはないでしょうか?
そんな時にはenumerate()が便利です!
目次
enumerate()でできること
インデックス番号を任意に変える
複数のリスト
インデックスと値を一文で表示する
インデックスと値を個別に取得
辞書
タプル
set型
文字列
array
多次元リスト
enumerate()でできること
enumerate()は指定した配列のインデックスを取得する関数で、enumerateオブジェクトを返します。引数にはシーケンスかiteratorか、イテレーションをサポートするその他のオブジェクトでなければなりません。
enumerate()の処理は以下のようになっています。
def enumerate(sequence, start=0):
n = start
for elem in sequence:
yield n, elem
n += 1
まずは引数にリストを代入してみます。
pokemon_picture_book = ["フシギダネ", "フシギソウ", "フシギバナ", "ヒトカゲ"]
for number, name in enumerate(pokemon_picture_book):
print(number, name)
#0 フシギダネ
#1 フシギソウ
#2 フシギバナ
#3 ヒトカゲ
同じことをrange()を使って行うと
for n in range(len(pokemon_picture_book)):
print(n, pokemon_picture_book[n])
enumurate()の方がシンプルですね!
for文の変数を一つだけにすると、タプルが出力されます。
for name in enumerate(pokemon_picture_book):
print(name)
#(0, 'フシギダネ')
#(1, 'フシギソウ')
#(2, 'フシギバナ')
#(3, 'ヒトカゲ')
インデックス番号を任意に変える
enumerate()ではインデックスの番号は0から始まることがデフォルトになっています。第二引数でインデックスが始まる数字を指定できます。
for number, name in enumerate(pokemon_picture_book, 1):
print(number, name)
#1 フシギダネ
#2 フシギソウ
#3 フシギバナ
#4 ヒトカゲ
pokemon_picture_book2 = ["ミニリュウ", "ハクリュー", "カイリュー", "ミュウツー"]
for number, name in enumerate(pokemon_picture_book2, 147):
print(number, name)
#147 ミニリュウ
#148 ハクリュー
#149 カイリュー
#150 ミュウツー
また次のようにインデックスを変えることもできます。
gosanke = ["フシギバナ", "リザードン", "カメックス"]
a = 3
for number, name in enumerate(gosanke, 1):
print(number * a, name)
#3 フシギバナ
#6 リザードン
#9 カメックス
複数のリスト
enumerate()では第一引数にひとつだけシーケンスを代入することができますが、zip()を使えば複数のシーケンスにループをかけられます。
shitennou1 = ["カンナ", "シバ", "キクコ", "ワタル"]
shitennou2 = ["イツキ", "キョウ", "シバ", "カリン"]
shitennou3 = ["カゲツ", "フヨウ", "プリム", "ゲンジ"]
for i, n in enumerate(zip(shitennou1, shitennou2, shitennou3), 1):
name1, name2, name3 = n
print(i, name1, name2, name3)
#1 カンナ イツキ カゲツ
#2 シバ キョウ フヨウ
#3 キクコ シバ プリム
#4 ワタル カリン ゲンジ
インデックスと値を一文で表示する
f文字列を使えば、インデックスと値をつづけて表示することができます。
for number, name in enumerate(pokemon_picture_book, 1):
print(f'{number}_{name}')
#1_フシギダネ
#2_フシギソウ
#3_フシギバナ
#4_ヒトカゲ
参考 Pythonのf文字列(フォーマット済み文字列リテラル)の使い方
インデックスと値を個別に取得
インデックスだけ取得する
for number, name in enumerate(pokemon_picture_book, 1):
print(number)
#1
#2
#3
#4
値だけ取得する
for number, name in enumerate(pokemon_picture_book, 1):
print(name)
#フシギダネ
#フシギソウ
#フシギバナ
#ヒトカゲ
辞書
キーとインデックスを同時に取得
Charizard_skills = {"かえんほうしゃ":90, "いあいぎり":50, "きりさく":70, "だいもんじ":120}
for i, skill in enumerate(Charizard_skills):
print(i, skill)
#0 かえんほうしゃ
#1 いあいぎり
#2 きりさく
#3 だいもんじ
値とインデックスを同時に取得
for i, damage in enumerate(Charizard_skills.values()):
print(i, damage)
#0 90
#1 50
#2 70
#3 120
キーと値のペアとインデックスを同時に取得
for skill, damage in enumerate(Charizard_skills.items()):
print(skill, damage)
#0 ('かえんほうしゃ', 90)
#1 ('いあいぎり', 50)
#2 ('きりさく', 70)
#3 ('だいもんじ', 120)
タプル
member = ("ヒトカゲ", "ポッポ", "ピカチュウ", "キャタピー")
for i in enumerate(member):
print(i)
#(0, 'ヒトカゲ')
#(1, 'ポッポ')
#(2, 'ピカチュウ')
#(3, 'キャタピー')
set型
gosanke_set = {("フシギバナ", "リザードン", "カメックス"),
("メガニウム", "バクフーン", "オーダイル"),
("ジュカイン", "バシャーモ", "ラグラージ")}
for i, name in enumerate(gosanke_set):
print(i, name)
#0 ('メガニウム', 'バクフーン', 'オーダイル')
#1 ('ジュカイン', 'バシャーモ', 'ラグラージ')
#2 ('フシギバナ', 'リザードン', 'カメックス')
文字列
a = "pokemon"
for i, v in enumerate(a):
print(i, v)
#0 p
#1 o
#2 k
#3 e
#4 m
#5 o
#6 n
array
import array
Garchomp_status = array.array("h", [108, 130, 95, 80, 85, 102])
for i in enumerate(Garchomp_status):
print(i)
#0 108
#1 130
#2 95
#3 80
#4 85
#5 102
多次元リスト
二次リストのインデックスを取得。リストだけでなく多次元のタプルや辞書、arrayでも可能。
pokemons = [["ヒトカゲ"], ["ゼニガメ", "コダック"]]
pokemons_list = list(enumerate(pokemons))
water_type = list(enumerate(pokemons[1]))
print("手持ちポケモン")
print(pokemons_list)
print("水タイプ")
print(water_type)
#手持ちポケモン
#[(0, ['ヒトカゲ']), (1, ['ゼニガメ', 'コダック'])]
#水タイプ
#[(0, 'ゼニガメ'), (1, 'コダック')]
for i, a in enumerate(pokemons[1]):
print(i,a)
#0 ゼニガメ
#1 コダック
以上、enumerate()についてでした!