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を使うことで辞書の要素の数え上げなどが簡単にできる。
今回は以上です。ここまで読んでくださり、ありがとうございました。