LoginSignup
6
6

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-09-21

Aidemy 2020/9/30

はじめにご挨拶から…

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

是非ご一読ください!

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

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

1. 一行記法

lambda(1)

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

・lambda 引数: 返り値

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

lambda(2) 引数が2つ以上の時

・引数を「,」で区切るだけ

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

lambda(3) ifを含むreturn関数の記述

・if elseを横に並べて書く
・lambda 引数: 処理(True) if 条件 else それ以外の処理

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

2. リストの分割表示

分割表示(1)

・ある記号(一種類)で分割したい時はsplit関数を使う。
・文字列.split("記号")

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

分割表示(2)

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

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

リストの各要素に関数を使いたい時

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

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(真偽判定関数,リスト))

# 上の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(降順))

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 リスト]

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 真偽判定関数]

#上の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)] でも可

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]

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など))

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(要素)

#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(要素数)」とすることで、降順にソートし、かつ指定された要素数を出力する。

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

まとめ

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

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

6
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6