0
1

More than 1 year has passed since last update.

内包表記覚え書き

Last updated at Posted at 2022-02-07

メモ程度に
基本的には[ 式 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節の後ろへ

ifのみ
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へループで分解している

参考

pythonの内包表記を少し詳しく

0
1
2

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
0
1