Pythonでリスト・辞書の操作を行ってみた！　〜その2〜

N今回は前回Pythonにてリスト・辞書の操作を行った続きを投稿いたします。


リストをN分割したい

リストをN分割する場合、要素数/Nを切り上げした数が分割後の要素サイズとなります。切り上げ処理にはmathモジュールのceil()を使用します。このサイズの間隔ごとにスライスすると、N分割したリストが得られます。以下のコードでは、リストを3分割しています。

```py
import math
l1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
n = 3
size = math.ceil(len(l1) / n)
l2 = [l1[idx:idx + size] for idx in range(0, len(l1), size)]
print(l2)
```
実行結果
[[1, 2, 3, 4], [5, 6, 7, 8], [9, 10]]が


リストの要素を条件指定で抽出したい

filter関数を使用すると、リストの中から指定条件に合致した要素だけ抽出することができます。第1引数に抽出条件となる関数を指定します。指定する関数は引数に対して何らかの判定を行う、つまり論理型を返すものを使用します。戻り値はfilter型というイテレータで、ループ処理したりリストに変換可能です。以下のコードでは、整数のリストl1に対し、奇数のものだけを抽出したfilterを取得しリストに変換しています。

```py
def is_odd(n):
    """ 奇数判定関数 """
    return (n % 2) == 1


l1 = [1, 2, 4, 5, 6, 10, 11]
ft = filter(is_odd, l1)
l2 = list(ft)
print(l2)
```
実行結果
[1, 5, 11]


リストを逆順にしたい

リストを逆順にする場合、以下の3通りの方法があります。

・スライス構文
・組み込みのreversed関数を利用する方法（元のリストは変更されず、逆順になったイテレータが得られる）
・リスト自身が持つreverseメソッドを利用して自身をソートする方法


スライス構文

リストの逆順を得る最も簡単な方法は、スライス構文を使用する方法です。スライス構文のstepにマイナス指定すると、逆方向にステップを刻むことが可能です。元のリストには変更が発生しません。

```py
l1 = [1, 2, 3, 4, 5]
l2 = l1[::-1]
print(l2)
```
実行結果
[5, 4, 3, 2, 1]


reversed関数

組み込みのreversed関数を使用すると、戻り値に逆順のイテレータが得られます。このイテレータはlist関数でリストに変換することができます。

```py
l1 = [1, 2, 3, 4, 5]
l2 = list(reversed(l1))
print(l2)
```
実行結果
[5, 4, 3, 2, 1]


reverseメソッド

リストのrevweseメソッドを使用すると、リストを逆順にすることができます。前述の通り元のリスト自体が逆順となります。

```py
l = [1, 2, 3, 4, 5]
l.reverse()
print(l)
```
実行結果
[5, 4, 3, 2, 1]


リストをランダムにシャッフルしたい

リストをランダムにシャッフルする場合、標準ライブラリのrabdomモジュールを使用します。以下の2通りの方法があります。

・sample関数を使用する（ランダムにシャッフルされた新たなリストが得られる）
・shuffle関数を使用する（元のリストがランダムにシャッフルされる）

sampleによるシャッフル

組み込みモジュールのrandomには、標本等のランダム抽選用の関数sampleが用意されているのですが、この抽出件数をリストと同じサイズにすることで、シャッフルした別のリストを得ることが可能です。

```py
import random

l1 = [0, 1, 2, 3, 4]
l2 = random.sample(l1, len(l1))
print(l2)
```
実行結果
[2, 4, 3, 1, 0]
※実行するたびに結果が変わります。


shuffleによるシャッフル

組み込みモジュールのrandomには、シーケンスをランダムにシャッフルする関数shuffleが用意されています。前述の通り、元のリストも変更されます。

```py
import random

l = [0, 1, 2, 3, 4]
random.shuffle(l)
print(l)
```
実行結果
[4, 3, 1, 2, 0]
実行するたびに結果が変わります。


リストから重複要素を除去したリストを作りたい

dict.fromkeys()を使用すると、引数で指定したリストのうち、重複を省いた要素をキーとした辞書を得ることができます。

```py
l1 = [1, 2, 1, 3, 5, 4, 4, 3]
print(dict.fromkeys(l1))
```
実行結果
{1: None, 2: None, 3: None, 5: None, 4: None}


lsit関数で辞書を指定するとキーのリストが得られるため、これらを合わせることにより重複要素を除去したリストを得ることができます。

```py
l1 = [1, 2, 1, 3, 5, 4, 4, 3]
l2 = list(dict.fromkeys(l1))
print(l2)
```
実行結果
[1, 2, 3, 5, 4]


キーと値のリストから辞書を生成したい

組み込みのzip関数を使用すると、複数のイテラブルな変数をまとめたイテレータを得ることができます。これを利用してキーと値のリストから辞書を生成することができます。

```py
keys = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
values = ['月曜日', '火曜日', '水曜日', '木曜日', '金曜日', '土曜日', '日曜日']

week_days = dict(zip(keys, values))
print(week_days)
```
実行結果
{'Monday': '月曜日', 'Tuesday': '火曜日', 'Wednesday': '水曜日', 'Thursday': '木曜日', 'Friday': '金曜日', 'Saturday': '土曜日', 'Sunday': '日曜日'}

英語の曜日をキーに、日本語の意味を値とした辞書が生成できたことが確認できます。


辞書のキーと値を入れ替えたい

辞書内包表記を活用すると、辞書のキーと値の入れ替えが簡単に書くことができます。
```py
d = {'key1': 100, 'key2': 200, 'key3': 300}
swapped_dict = {value: key for key, value in d.items()}
print(swapped_dict)
```
実行結果
{100: 'key1', 200: 'key2', 300: 'key3'}



2つの辞書をマージしたい

updateメソッド
dict型のupdateメソッドを使用すると、引数にマージしたい辞書を指定して辞書をマージすることができます。なお、キーに重複がある場合は引数で指定した辞書の値が優先されます。元の辞書自体が変更されるという点に注意する必要があります。

```py
d1 = {"key1": 100, "key2": 200}
d2 = {"key2": 220, "key3": 300, "key4": 400}

d1.update(d2)  # d1にd2をマージ
print(d1)
```
実行結果
{'key1': 100, 'key2': 220, 'key3': 300, 'key4': 400}



2回に渡りましたが、リスト・辞書の操作について学習した内容を投稿させていただきました。また、今後とも学習内容を投稿していきます。


エンジニアファーストの会社　[CRE-COエンジニアリングサービス](https://www.cre-co.jp/)　H.M