データクレンジング1　lambdaやmapなどの便利なPython記法

[Aidemy](https://aidemy.net/)　2020/9/30

#はじめにご挨拶から…
　初めまして、んがょぺです！バリバリの文系ですが、AIの可能性に興味を持ったのがきっかけで、今週からAI学習スクール「Aidemy」に通いはじめました。そこでAIに関する様々な知識を学んでいます。これらの知識を皆さんと共有したいと思い、Qiitaでまとめることにしました。

是非ご一読ください！


※あくまでも初心者がAidemyの教材を「自分の言葉で」まとめたものですので、表現の間違いや勘違い等を含む可能性があります。ご了承ください。

今回学ぶこと
・1行記法
・リストの分割表示
・辞書に対して行う処理


#1.　一行記法

##lambda（1）
・defで定義し、returnで返す関数は、lambdaを使うと1行で表現できる。

__・lambda 引数: 返り値__

```python
# x*4を返す関数aを定義
a=lambda x: x*4
print(a(4))
# 16
```

##lambda(2)　引数が２つ以上の時
・引数を「,」で区切るだけ

```python
a=lambda x,y: x+y
print(a(3,6))
# 9
```

##lambda(3)　ifを含むreturn関数の記述
・if elseを横に並べて書く
__・lambda 引数: 処理（True） if 条件 else それ以外の処理__

```python
a=lambda x: x*4 if x>4 else x=4
print(a(6))
# 24
```

#2．　リストの分割表示
##分割表示（1）
・ある記号（一種類）で分割したい時はsplit関数を使う。
__・文字列.split("記号")__

```python
text="my name is ngayope"
text.split(" ") # " (スペース)"で区切る
# ['my','name','is','ngayope']
```

##分割表示（2）
・複数の記号で分割したい時はre.split関数を使う（使用にはreのインポートが必要）
__・re.split("[記号]",文字列)__

```python
import re
text="フシギダネ,ヒトカゲ.ゼニガメ"
re.split("[,.]",text)
# ['フシギダネ','ヒトカゲ','ゼニガメ']
```

##リストの各要素に関数を使いたい時
・リストの各要素に関数を使う時はmap関数を使う。このような関数を「イテレータ」という。
__・list(map(関数、リスト))__　*list()で囲まないと関数適用結果が反映されない！

```python
import re
time_list =["2006/11/26_2:40","2009/1/16_23:35","2014/5/4_14:26","2017/8/9_7:5","2017/4/1_22:15"]

#　time_listから「時」を抽出する関数
hour_pick = lambda x: int(re.split("[/_:]",x)[3])
#　↑まずre.splitで文字列を分割。次にこの文字列をint()で数値に変換。最後に[3]で「時」の部分を抽出するという関数をlambdaで1行で表示。

#time_listに関数適用、その結果を返す。
list(map(hour_pick,time_list))
# [2,23,14,7,22]
```

##リストの各要素のうち、条件（真偽判定関数）を満たした要素だけ抽出
・mapと同じようにfilter関数を使いことで抽出できる。
__・list(filter(真偽判定関数,リスト))__

```python
#　上のtime_listのうち、「月」が7月以降のもののみTrueとする関数
judge=lambda a: int(re.split("[/_:]",a)[1] >6
list(filter(judge,time_list))
# ["2006/11/26_2:40","2017/8/9_7:5"]
```

##ソートの基準を関数で指定してソートする
・sort関数でなく、 sorted関数を使用する。
__・sorted(リスト,key=基準となる関数,reverse=True(降順))__

```python
list1=[[2,3][4,1][5,5][9,0][0,7][1,6]]
# 2つめの要素を基準にソート（降順）
sorted(list1,key=lambda x: x[1],reverse=False)
# [[0,7][1,6][5,5][2,3][4,1][9,0]]
```

#リストの中にforやifを表記する
##リストの中にforの記述
・以下のようにしても、map関数と同じように要素の全てに関数を適用できる。
__・[関数 for 変数 in リスト]__

```python
cm=[100,50,500,3,380]
#[◯m,◯cm]というように計算する関数
m_cm=lambda x:[x//100,x%100]
print([m_cm(x) for x in cm])
#[[1,0],[0,50],[5,0],[0,3],[3,80]]
```

##リストの中に条件（if）付きforの記述
・以下のようにしても、filter関数と同じように条件を満たした要素のみの抽出ができる。
__・[要素 for 変数 in リスト if 真偽判定関数]__

```python
#上のcmで「1mを超えているもの」のみ抽出
[x for x in cm if x>=100]
# [100,500,380]
```

##複数のリストを同時にループする
・別々のリストであっても、zip関数を使って一つのループ処理が行える。
__・for 変数1,2 in zip(リスト1,2):__
処理
__・[処理 for 変数1,2 in zip(リスト1,2)]__　でも可

```python
a = [1,-2,3,-4,5]
b = [9,8,-7,-6,-5]
# リストのそれぞれの要素について、x*4+y*2を行う
[x*4+y*2 for x,y in zip(a, b)]
# [22,8,-2,-28,10]
```

##ループの中でさらにループを行う
・二つのリストの片方のループに対して、もう片方もループさせる時
・二つのリストにそれぞれfor文を設定し、二つの変数についての処理を記述する。
・リスト内処理にするには、以下の方法を使う。
**[[処理]for 変数1 in リスト1 for 変数2 in リスト2]**

```python
a=[1,2]
b=[5,6]
print([[x+y]for x in a for y in b])
# [6,7,7,8]
```

#辞書に対して行う処理
##要素の個数を数えて、辞書として出力する
・通常ならいちいち辞書の中身を初期化する必要があるが、辞書の代わりにdefaultdictクラスを使えば簡単に追加できる。
**・defaultdict(要素の型（int,dirなど）)**

```python
from collections import defaultdict

d=defaultdict(int)
lst=['フシギダネ','ヒトカゲ','ゼニガメ','ヒトカゲ']
# リストの各要素をkeyとして取り出し、出てきたkeyの個数を＋1する
for key in lst:
__d[key] += 1
print(d)
# defaultdict(<class='int'>,{'フシギダネ':1,'ヒトカゲ':2,'ゼニガメ':1})
```

##list型の辞書のvalue内に要素を追加
・defaultdictを使うことで簡単に要素を追加できる。
**・defaultdict辞書[key].append(要素)**

```python
#list型の辞書
a=[('ヒトカゲ',5),('リザード',16),('リザードン',36),('リザードン',100)]
d=defaultdict(list)
#aのindex[0]をxに、index[1]をyに代入して取り出し
for x,y in a:
__d[x].append(y)
print(d)
#defaultdict(<class='list'>,{'ヒトカゲ':[5],'リザード':[16],'リザードン':[36,100]})
```

#もっと簡単に数え上げ
・Counterクラスを使うことで、defaultdictより簡単に数えられる。
**・Counter(数えるデータ)**
・「.most_common(要素数)」とすることで、降順にソートし、かつ指定された要素数を出力する。

```python
from collections import Counter
lst=['フシギダネ','ヒトカゲ','ゼニガメ','ヒトカゲ']
print(Counter(lst).most_common(1))
# Counter({'ヒトカゲ':2})
```

#まとめ
・lambdaを使うことで、関数を1行でかける。
・splitやre．splitでリストを分割できる。
・リスト[]のなかにfor文と関数を記載すれば、リストの要素に対して簡単に関数が適用できる。
・defaultdictやCounterを使うことで辞書の要素の数え上げなどが簡単にできる。


今回は以上です。ここまで読んでくださり、ありがとうございました。