タプル・辞書や、それを用いたラムダ式など

#　タプル
タプルとはリストと同様に複数の値を1個の値として扱えるようになります。しかし、リストと異なり、 作成した後に要素の追加や削除ができない点に注意してみてください。

タプルを作成するには、tuple()の形を活用します。

```
x = tuple(range(0, 10, 2))
```

タプルにインデックス番号を付けてみましょう。その際は、enumerateを使用します。

```
tap = (1, 2, 3, 4, 5) 
for i, x in enumerate(tap, 1):
    print(i, x)

出力結果
1　1
2　2
3  3
4  4
5  5
```

#　セット
ここでは、セットを用いてリストの重複を削除する方法を記述します。

```
a = [3,1,2,3,4,5]
b = [2,4,6,8,2]
```

まずセットに変換しましょう！

```
a_set = set(a)
b_set = set(b)
```

a_setにb_setを合わせ、list()でリスト化します。

```
a_set |= b_set
print(list(a_set))

出力結果
[1, 2, 3, 4, 5, 6, 8]
```


次は、先ほどのリストをリスト内方表記で作成してみましょう。また、リスト要素を降順にします。

```
list_a = [x for x in list(set(a) | set(b)) if x % 2 != 0]
list_a.sort()

print(list_a)

出力結果
[1, 3, 5]
```

#　dict　(辞書)
辞書は、左にkeyを持ち、右にvalueを持っているセットの事を言います。
早速作ってみましょう。まずzip()の使用方法を確認してみましょう。

```
keys = [1, 2, 3]
values = [2, 4, 6]
data = dict(zip(keys, values))
print(data)
print(data[1])

出力結果
{1: 2, 2: 4, 3: 6}
2
```

updateも使用頻度の高いメソッドです。

```
data1 = {"a": 1, "b": 2, "c": 3}
data2 = {"a": 1, "d": 4}
data1.update(data2)
print(data1)
print(len(data1))

出力結果
{'a': 1, 'b': 2, 'c': 3, 'd': 4}
4
```

バリューの合計値は以下のように示します。

```
x = {1:2, 2:4, 3:6}
print(sum(x.values()))

出力結果
12
```

リストの要素をkeyとし、値は各要素の２倍のdictを作れ

```
key = [1,2,3]
values = [keys*2 for keys in key]
data = dict(zip(keys, values))
print(data)
出力結果
{1: 2, 2: 4, 3: 6}
```

dict.fromkeysは便利なメソッドです。以下の場合は、バリューが全て、1と指定されます。

```
data = dict.fromkeys(key, 1)
print(data)
出力結果
{1: 1, 2: 1, 3: 1}
```

以下のkeys,valuesのリストからdictを作ってみましょう。

```
keys = [1,2,3,4,5]
values = [2,4,6,8,10]
data = dict(zip(keys, values))
print(data)

出力結果
{1: 2, 2: 4, 3: 6, 4: 8, 5: 10}
```

【応用です。】
.items()で辞書の中の、key, valueを取り出すことが出来ます。

keyが2の倍数の時のvalueの値の合計を求めよ

```
di = {1:2, 2:4, 3:6, 4:8}

total = 0

for key, value in di.items() :
    if int(key) % 2 == 0 :
        total += value
        
print(total)

出力結果
12
```

#　クロージャー関数
クロージャー関数とは、関数が２重構造になっており、１つ目の関数を実行すると、中の関数を返すような仕組みの関数である。

#　ラムダ式
ラムダ式は非常に使用頻度が高く、また使い捨て関数として、多用できます。是非、書けるようにしてみましょう。

```
text =(lambda  x: "{}!".format(x)) ("こんにちは")　#後ろの()に引数を取ります。
print(text)

出力結果
こんにちは
```

#　ソート関数
ソートする際に、関数名で指定すること、でソートを行うことが出来ます。

```
def func(x):
    keys = {
    "こ": 4,
    "ん": 3,
    "に": 2,
    "ち": 1,
    "は": 0
    }
    return keys[x]

data = list("こんにちは")
data.sort(key = func)
print(data)

出力結果
['は', 'ち', 'に', 'ん', 'こ']
```


はじめに渡した引数をタグとして括って返してくれるクロージャ関数を作れ
例： "html"を渡して作った関数に123を渡すと<html>123</html>として返してくれる
例： "body"を渡して作った関数に"abc"を渡すと<body>abc</body>として返してくれる

```
def tag_func(a):
    def tag_make(x) :
        return "<{}>{}</{}>".format(a,x,a)
    return tag_make

tag_func("html")(123)
tag_func("body")(123)

出力結果
'<body>123</body>'
```

これをラムダ式で書き表すとこうなります。

```
text= (lambda a, x : "<{}>{}</{}>".format(a,x,a))("html", 123)
print(text)
出力結果
<html>123</html>
```


7倍した時の一の位の数字で並べ替えよ
例：4,5→ 28,35 よって 8と5なので、4,5は5,4と並び替えられる

```
data = [1,2,3,4,5,6,7,8,9]

def func(x) :
    return int(str(x*7)[-1])
data.sort(key=func)
print(data)
[3, 6, 9, 2, 5, 8, 1, 4, 7]
```

#　mapとfilter
```
def double(x):
    return x * 2

data = [1,2,3,4,5]
double_list = list(map(double,data))
print(double_list)
```
ラムダ式で書き表すとこうなる

```
data = [1,2,3,4,5]

double_list = list(map(lambda x : x*2 , data))
print(double_list)
```

filter

```
data = [1,2,3,4,5]
picked = list(filter(lambda x : x % 2 == 0, data))
print(picked)
```

本日はここまでお疲れ様でした！