【Python】ループで辞書やリストの値を取得する方法を合計10種類まとめてみた

# 概要
- Pythonで辞書やリストを`for`文で回して値を取得する際にいくつか種類があるのでまとめてみました。
- 今回は、辞書(リスト)`ip_addresses`の要素を反復処理し、各要素の値を表示するためのループを使用しています。
- 辞書で4種類、リストで4種類、おまけで2つ、合計10種類をまとめてみました。

# 辞書の場合：4種類を紹介
## ①[辞書]`for`ループで値をiに代入して出力する方法

```py
ip_addresses = {'ip_address-1':'111.111.11.11', 'ip_address-2':'222.222.22.22'}
for i in ip_addresses.values():
    print(i)
    # 111.111.11.11
    # 222.222.22.22
```

- 値そのものを取得しています。ループの各イテレーションで変数`i`には辞書の値が代入されますので、その値を直接表示します。
- 辞書内のすべての値に順番にアクセスできます。
- 値だけを使用して処理を行う場合は、こちらが良いかもしれません。

## ②[辞書]`for`ループでキーをiに代入して出力する方法

```py
ip_addresses = {'ip_address-1':'111.111.11.11', 'ip_address-2':'222.222.22.22'}
for i in ip_addresses:
    print(ip_addresses[i])
    # 111.111.11.11
    # 222.222.22.22
```

- キーを使ってて各要素にアクセスし値を取得しています。ループの各イテレーションで変数`i`には辞書のキーが代入されます。それから `ip_addresses[i]`を使用して、辞書の値を取得して表示します。
- キーと値の両方を使用して何か処理を行いたい場合は、これを使うと良いかもしれません。

## ③[辞書]`for`ループと`items()`メソッドを使用して出力する方法

```py
ip_addresses = {'ip_address-1':'111.111.11.11', 'ip_address-2':'222.222.22.22'}
for key, value in ip_addresses.items():
    print(value)
    # 111.111.11.11
    # 222.222.22.22
```

- `items()`メソッド（辞書のキーと値のペアを要素とするイテレータを返すメソッド）を使用して辞書のキーと値のペアに順番にアクセスします。
- `for`ループでは、各ループイテレーションごとにキーと値が変数`key`と`value`にアンパックされ、それぞれの値が出力されます。

## ④[辞書]`for`ループと`keys()`メソッドを使用して出力する方法

```py
ip_addresses = {'ip_address-1':'111.111.11.11', 'ip_address-2':'222.222.22.22'}
for key in ip_addresses.keys():
    value = ip_addresses[key]
    print(value)
    # 111.111.11.11
    # 222.222.22.22
```

- ↑はちょっと無理矢理な気もしますが...`keys()`メソッドを使用して辞書のキーを取得し、それを使用して値にアクセスする方法もあります。

# リストの場合：4種類を紹介
## ⑤[リスト]`for`ループで直接リストの要素にアクセスする方法

```py
ip_addresses = ['111.111.11.11', '222.222.22.22']
for i in ip_addresses:
    print(i)
    # 111.111.11.11
    # 222.222.22.22
```

- Pythonでは、リストに対しても`for`文で要素を取り出すことができます。

## ⑥[リスト]`for`ループとインデックスを使用して出力する方法

```py
ip_addresses = ['111.111.11.11', '222.222.22.22']
print(len(ip_addresses))
# 2

for i in range(len(ip_addresses)):
    print(ip_addresses[i])
    # 111.111.11.11
    # 222.222.22.22
```

- `len(ip_addresses)`はリストの要素数を取得します。
- `range(len(ip_addresses))`によって、インデックス範囲を表す数値のシーケンスを生成します。

## ⑦[リスト]`enumerate()`を使用して出力する方法

```py
ip_addresses = ['111.111.11.11', '222.222.22.22']
for index, value in enumerate(ip_addresses):
    print(index, value)
    # 0 111.111.11.11
    # 1 222.222.22.22
```

- `enumerate()`関数は、イテラブル（リスト、タプル、文字列など）の要素とそれに対応するインデックスのペアを生成する関数。
- `for`ループでは、各イテレーションで現在の要素とそのインデックスが`index`と`value`にアンパックされます。

## ⑧[リスト]`iter()`関数と`next()`関数を使用して出力する方法

```py
ip_addresses = ['111.111.11.11', '222.222.22.22']
iter_ip_addresses = iter(ip_addresses)
print(next(iter_ip_addresses))
print(next(iter_ip_addresses))
# 111.111.11.11
# 222.222.22.22
```

- `iter()`関数は、与えられたオブジェクトからイテレータを作成するための組み込み関数。
- イテレータを使うことで、要素を逐次的に取り出すことができますが...まぁここまでやるなら直接`for`ループで取り出すのが一般的ですかね笑

## おまけ：[リスト]&[辞書]リスト内包表記を使用する方法

```py
# ⑨辞書の場合
ip_addresses = {'ip_address-1': '111.111.11.11', 'ip_address-2': '222.222.22.22'}
values = [value for value in ip_addresses.values()]
print(values)
# ['111.111.11.11', '222.222.22.22']

# ⑩リストの場合
ip_addresses = ['111.111.11.11', '222.222.22.22']
values = [value for value in ip_addresses]
print(values)
# ['111.111.11.11', '222.222.22.22']

## もしくは

ip_addresses = ['111.111.11.11', '222.222.22.22']
[print(value) for value in ip_addresses]
# 111.111.11.11
# 222.222.22.22
```

- リスト内包表記、ほぼ使ったことないのですが、無理矢理使うとこうなりますね。
- ただ、リスト内包表記は効率的に新しいリストを作成するためのものなので、これはあまり推奨されないでしょう。