Pythonのenumerate()について

for文を使うときに値とインデックス番号を同時に取得したいと思ったことはないでしょうか？
そんな時にはenumerate()が便利です！

# 目次
[enumerate()でできること](#enumerate()でできること)
[インデックス番号を任意に変える](#インデックス番号を任意に変える)
[複数のリスト](#複数のリスト)
[インデックスと値を一文で表示する](#インデックスと値を一文で表示する)
[インデックスと値を個別に取得](#インデックスと値を個別に取得)
[辞書](#辞書)
[タプル](#タプル)
[set型](#set型)
[文字列](#文字列)
[array](#array)
[多次元リスト](#多次元リスト)

# enumerate()でできること

enumerate()は指定した配列のインデックスを取得する関数で、enumerateオブジェクトを返します。引数にはシーケンスかiteratorか、イテレーションをサポートするその他のオブジェクトでなければなりません。

enumerate()の処理は以下のようになっています。
```python
def enumerate(sequence, start=0):
    n = start
    for elem in sequence:
        yield n, elem
        n += 1
```


まずは引数にリストを代入してみます。

```python
pokemon_picture_book = ["フシギダネ", "フシギソウ", "フシギバナ", "ヒトカゲ"]

for number, name in enumerate(pokemon_picture_book):
    print(number, name)

#0 フシギダネ
#1 フシギソウ
#2 フシギバナ
#3 ヒトカゲ
```

同じことをrange()を使って行うと
```python
for n in range(len(pokemon_picture_book)):
    print(n, pokemon_picture_book[n])
```
enumurate()の方がシンプルですね！

for文の変数を一つだけにすると、タプルが出力されます。
```python
for name in enumerate(pokemon_picture_book):
    print(name)

#(0, 'フシギダネ')
#(1, 'フシギソウ')
#(2, 'フシギバナ')
#(3, 'ヒトカゲ')
```

# インデックス番号を任意に変える

enumerate()ではインデックスの番号は0から始まることがデフォルトになっています。第二引数でインデックスが始まる数字を指定できます。
```python
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 ミュウツー
```

また次のようにインデックスを変えることもできます。
```python
gosanke = ["フシギバナ", "リザードン", "カメックス"]
a = 3
for number, name in enumerate(gosanke, 1):
    print(number * a, name)

#3 フシギバナ
#6 リザードン
#9 カメックス
```

# 複数のリスト
enumerate（）では第一引数にひとつだけシーケンスを代入することができますが、zip()を使えば複数のシーケンスにループをかけられます。
```python
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文字列を使えば、インデックスと値をつづけて表示することができます。
```python
for number, name in enumerate(pokemon_picture_book, 1):
    print(f'{number}_{name}')

#1_フシギダネ
#2_フシギソウ
#3_フシギバナ
#4_ヒトカゲ
```
参考　[Pythonのf文字列（フォーマット済み文字列リテラル）の使い方](https://qiita.com/TP-faure/items/216b9d76b3855a389e8c)

# インデックスと値を個別に取得
インデックスだけ取得する
```python
for number, name in enumerate(pokemon_picture_book, 1):
    print(number)

#1
#2
#3
#4
```

値だけ取得する
```python
for number, name in enumerate(pokemon_picture_book, 1):
    print(name)

#フシギダネ
#フシギソウ
#フシギバナ
#ヒトカゲ
```

# 辞書
キーとインデックスを同時に取得
```python
Charizard_skills = {"かえんほうしゃ":90, "いあいぎり":50, "きりさく":70, "だいもんじ":120}

for i, skill in enumerate(Charizard_skills):
    print(i, skill)

#0 かえんほうしゃ
#1 いあいぎり
#2 きりさく
#3 だいもんじ
```

値とインデックスを同時に取得
```python
for i, damage in enumerate(Charizard_skills.values()):
    print(i, damage)

#0 90
#1 50
#2 70
#3 120
```

キーと値のペアとインデックスを同時に取得
```python
for skill, damage in enumerate(Charizard_skills.items()):
    print(skill, damage)

#0 ('かえんほうしゃ', 90)
#1 ('いあいぎり', 50)
#2 ('きりさく', 70)
#3 ('だいもんじ', 120)
```

# タプル
```python
member = ("ヒトカゲ", "ポッポ", "ピカチュウ", "キャタピー")

for i in enumerate(member):
    print(i)

#(0, 'ヒトカゲ')
#(1, 'ポッポ')
#(2, 'ピカチュウ')
#(3, 'キャタピー')
```

# set型
```python
gosanke_set = {("フシギバナ", "リザードン", "カメックス"),
               ("メガニウム", "バクフーン", "オーダイル"),
               ("ジュカイン", "バシャーモ", "ラグラージ")}
for i, name in enumerate(gosanke_set):
    print(i, name)

#0 ('メガニウム', 'バクフーン', 'オーダイル')
#1 ('ジュカイン', 'バシャーモ', 'ラグラージ')
#2 ('フシギバナ', 'リザードン', 'カメックス')
```

# 文字列
```python
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
```python
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でも可能。
```python
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()についてでした！