メモ程度に
基本的には[ 式 for 変数 in 入力したいデータ(イテラブルなオブジェクト)]
の形式をとる。(少しmap関数っぽい)
リスト内包表記
リストを生成する際に用いる内包表記、
形式は[ 式 for 変数 in イテラブルなオブジェクト]
# [1,2,3,4,5]を作成したい場合
# appendを使った場合
li = []
for i in range(1,6):
li.append(i)
# 内包表記を使った場合
li = [i for i in range(1,6)]
# データを式に代入することも出来る
li = [i*2 for i in range(1,6)]
print(li)
# [2,4,6,8,10]
またif
などの条件式も用いることが出来る
ifを用いた内包表記
式の部分へif
を書くかと思いきや、for節の後に置くことになる。
li = [ i for i in range(1,6) if i%2 == 0]
print(li)
# [2,4]
しかしelse
を含む条件を書きたい場合は位置が変わる。(リストに入力される式へ配置する)
[ i if節 else節 for 変数 in イテラブルなオブジェクト]
li = [i if i%2 == 0 else i*2 for i in range(1,6)]
print(li)
# [2, 2, 6, 4, 10]
どうやらifを含むと内包表記の特徴である処理速度が若干落ちるらしい
辞書における内包表記
辞書でもリスト内包表記の様に生成できる。
形式は{ key:value for 変数 in イテラブルなオブジェクト}
# { "No1":"A", "No2":"B", "No3":"B" }を作りたい場合
#単純に代入していく時は
key = ["No1","No2","No3"]
val = ["A","B","C"]
dic = {}
for i in range(len(key)):
dic[key[i]] = val[i]
# zipを使う場合
key = ["No1","No2","No3"]
val = ["A","B","C"]
dic = dict(zip(key,val))
# 内包表記
key = ["No1","No2","No3"]
val = ["A","B","C"]
dic = {i:j for i,j in zip(key,val)}
例によって条件式も使える
辞書内包表記におけるif節
if
のみであればリスト内包表記と同様にfor節の後ろへ
dic = {i:j for i,j in zip(key,val) if j == "A" or i == "No3"}
print(dic)
# {'No1': 'A', 'No3': 'C'}
else
を含む場合はkey:val
の各々の後方に記述する
{i if節 else:j if節 else for i,j in zip(key,val)}
li = {"No"+str(i) if i%2 == 0 else str(i) + " is odd" :i if i%2 == 1 else "even" for i in range(1,6)}
print(li)
# {'1 is odd': 1, 'No2': 'even', '3 is odd': 3, 'No4': 'even', '5 is odd': 5}
elifを用いたい場合
条件式をif節、elifの数だけ書いてしまえば良い。
[i if節 else 前述のelseの結果へのif節 else ... for i in イテラブルなオブジェクト]
# これをしたい場合
alpha_li = ["A","B","C","D"]
li = []
for i in alpha_li:
if i == "A":
li.append("red")
elif i == "B":
li.append("blue")
else:
li.append("yellow")
# li = ["red","blue","yellow","yellow"]
# これを内包表記で書いた場合
alpha_li = ["A","B","C","D"]
li = ["red" if i=="A" else "blue" if i=="B" else "yellow" for i in alpha_li]
# i=="A"の場合はredに、違う場合はblueに
# i=="B"の場合は前述のblueがそのまま出力、違う場合はyellowが
多重配列を作りたい場合
内包表記内に内包表記を書けばOK
[[i for i in イテラブルなオブジェクト] for k in イテラブルなオブジェクト]
# [[A,B,C],[A,B,C],[A,B,C]]を作りたい場合
li = [[i for i in ["A","B","C"]] for k in range(3)]
多次元配列を一次元に
多次元配列を一次元に整形する
# [[1,2,3],[4,5,6],[7,8,9]] を [1,2,3,4,5,6,7,8,9]に
multi_li = [[1,2,3],[4,5,6],[7,8,9]]
li = [i for first in multi_li for i in first]
print(li)
# [1,2,3,4,5,6,7,8,9]
# 内包表記は基本的に後ろへかかっていく
# firstには[1,2,3]や[4,5,6]などがそれぞれループで入り、それをiへループで分解している