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

pythonに関して様々投稿してきたわけですが、今回はリスト・辞書の操作に関しての投稿です。では早速投稿していきます。


```py
l1 = [1, 2, 3]
l2 = l1 * 3
print(l2)
```

実行結果
[1, 2, 3, 1, 2, 3, 1, 2, 3]

これを利用すると、N個と同じ要素からなるリストを生成することが可能になります。

リストの結合
```py
l1 = ["りんご", "みかん", "バナナ"]
l2 = ["いちご", "オレンジ", "パイナップル"]
l3 = l1 + l2
print(l1)
print(l2)
print(l3)
```

実行結果
['りんご', 'みかん', 'バナナ']
['いちご', 'オレンジ', 'パイナップル']
['りんご', 'みかん', 'バナナ', 'いちご', 'オレンジ', 'パイナップル']

extendメソッドを使用すると、リストの対して別のリストを結合することができます。次のコードでは、リストl1にl2を結合しています。

```py
l1 = ["りんご", "みかん", "バナナ"]
l2 = ["いちご", "オレンジ", "パイナップル"]
l1.extend(l2)
print(l1)
```
実行結果
['りんご', 'みかん', 'バナナ', 'いちご', 'オレンジ', 'パイナップル']

二つのリストが結合されたことが確認できます。

今度はリストの要素をソートしてみます。リストをソートする場合以下の2通りの方法があります。

・組み込みのsorted関数を利用する方法（元のリストは変更されず、ソートされたリストが得られる）
・リスト自身が持つsortメソッドを利用して自身をソートする方法

新たにソートされたリストを生成したい場合、sorted関数を利用します。戻り値にソート済みの新たなリストが得られ、上述の通り元のリストは変更がありません。

引数にソートしたいリストを指定すると、昇順にソートすることができます。

```py
l1 = ['d', 'b', 'c', 'a']
l2 = sorted(l1)
print(l2)
```
実行結果
['a', 'b', 'c', 'd']

また、引数のreverseにtrueを指定すると、ソート順序が逆順になります。

```py
l1 = ['d', 'b', 'c', 'a']
l2 = sorted(l1, reverse=True)
print(l2)
```
実行結果
['d', 'c', 'b', 'a']

keyにソートする関数オブジェクトを指定すると、ソート前に処理を実行することができます。例えば、引数keyにstr.lowerを指定すると、ソート処理前にリストの各要素がいったんすべて小文字に変換され、それらがソートされた結果に返却されます。

```py
l1 = ['bc', 'ac', 'bD', 'AB']
l2 = sorted(l1)
print(l2)

l2 = sorted(l1, key=str.lower)
print(l2)
```

実行結果
['AB', 'ac', 'bD', 'bc']
['AB', 'ac', 'bc', 'bD']

key=str.lowerを指定することにより、大文字、小文字の区別なくソートされていることが確認できます。

元のリスト型変数自身をソートする場合、sortメソッドを使用します。上で説明した組み込み関数のsorted関数と使い方はほとんど同じですので、細かい説明は割愛します。


昇順にソート
```py
l = ['d', 'b', 'c', 'a']
l.sort()
print(l)
```
実行結果
['a', 'b', 'c', 'd']


逆順にソート

```py
l = ['d', 'b', 'c', 'a']
l.sort(reverse=True)
print(l)
```
実行結果
['d', 'c', 'b', 'a']


大文字、小文字を区別せずにソート

```py
l = ['bc', 'ac', 'bD', 'AB']
l.sort(key=str.lower)
print(l)
```
実行結果
['AB', 'ac', 'bc', 'bD']

いずれのコードでも、メソッドを実行したリストがソートされたことが確認できます。


次に、map関数を使用すると、リスト等のシーケンスのすべての要素に対し、指定した関数の処理を実行した、mapオブジェクトを得ることができます。第1引数に関数オブジェクト、第2引数にリストなどのシーケンスを指定します。以下のコードではリストのすべての要素を2倍しています。

```py
# 数値を倍にする関数
def calc_double(n):
    return n * 2


l1 = [1, 3, 6, 50, 5]

# map関数を使用してl1の要素を全て倍にしてmap1に格納
map1 = map(calc_double, l1)

# map型をlist型に変換したものをl2に格納
l2 = list(map1)

print(l2)
```
実行結果
[2, 6, 12, 100, 10]

map次に関数を使用すると、新たにリストを作成し、ループで回しがてappendして・・・という手間が省けます。map関数の戻り値はmapオブジェクトと呼ばれるもので、ループ処理はできるのですが、インデックスを指定して参照したり、append等のlistのメソッドは使用できません。また、print関数で出力しても、カンマ区切りの要素では表示されず、オブジェクトの型名が表示されるだけです。再度リスト型にしたい場合は、前記のコードのようにlist()変換します。また、mapオブジェクトはイテレータであるため、一度for文やlist()で読み込むと内容が参照できなくなります。次のコードは先ほどのコード下部を空にしたものです。

```py
# 数値を倍にする関数
def calc_double(n):
    return n * 2


l1 = [1, 3, 6, 50, 5]

map1 = map(calc_double, l1)
for x in map1:
    print(x)

l2 = list(map1)
print(l2)
```
実行結果
2
6
12
100
10
[]

次に、リストのCSV変換を学習します。実業務において、データが格納されたリストをCSVやTSVでダンプしたいという場合がよくあります。文字列だけの場合はjoinだけでできてしまうのですが、文字列以外が入る場合はjoin、map関数、str関数を組み合わせる必要があります。

まずは文字列要素だけのリストをCSV文字列に変換してみます。リストのjoinメソッドを使用すると、リストの要素をカンマやタブといった任意の区切り文字で連結することができます。以下のコードでは、リストをCSV文字列に変換してprint出力しています。

```py
l = ["りんご", "みかん", "バナナ"]
csv_str = ",".join(l)
print(csv_str)
```
実行結果
りんご,みかん,バナナ

先ほどのコードで文字列以外、例えば数値などの場合、エラーが発生します。それぞれの要素に対し、str関数でいったんstrオブジェクトに変換すると、この問題を解決することができます。この要素ごとの返還にはmap関数を使用します。

```py
item_data = ['みかん', '果物', 200]
csv_str = ",".join(map(str, item_data))
print(csv_str)
```
実行結果
みかん,果物,200


次は、リストをN個ずつの要素に分割するコードです。方法はいくらかあるのですが、単純な方法としてN個の要素ずつスライスしてジェネレータで返す方法があります。以下のコードでは、要素数が10個のリストを3個の要素ずつ分割しています。

```py
def split_list(l, n):
    for idx in range(0, len(l), n):
        yield l[idx:idx + n]

l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
result = list(split_list(l, 3))
print(result)
```
実行結果
[[1, 2, 3], [4, 5, 6], [7, 8, 9], [10]]


以上が今回の学習になります。また今後も学習の成果を投稿という形でアウトプットしていきたく思います。


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