LoginSignup
0
3

Pythonの内包表記

Last updated at Posted at 2023-09-16

はじめに

 内包表記は、for文を1行で簡潔に表現できる便利な方法。だけど、パッと見わかりにくいので、使用例と合わせてまとめる。

一覧

用途 表記
リスト出力 ['出力式' for '変数' in range()]
2次元リスト出力 [['出力式' for '変数' in range()] for '変数' in range()]
if分岐出力 ['出力式' for '変数' in range() if '条件文' ]
2分岐以上出力 ['ifの出力式' if '条件文' else 'elseの出力式' for '変数' in range()]
タプル出力 tuple('出力式' for '変数' in range())
辞書出力 {key : value for '変数' in range()}
分岐と辞書組み合わせ { ('key用の分岐式') : ('value用の分岐式') for '変数' in range() }

リスト出力

['出力式' for '変数' in range()]
 偶数のリスト出力する例。

ListComprehension.py
out_list = [i*2 for i in range(10)]
print(out_list)

出力結果

[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

戻る

2次元リスト出力

[['出力式' for '変数' in range()] for '変数' in range()]
 2次元リスト出力する例。

ListComprehension.py
out_list = [[i*j for j in range(10)] for i in range(10)]
print(out_list)

出力結果

[[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 2, 4, 6, 8, 10, 12, 14, 16, 18], [0, 3, 6, 9, 12, 15, 18, 21, 24, 27], [0, 4, 8, 12, 16, 20, 24, 28, 32, 36], [0, 5, 10, 15, 20, 25, 30, 35, 40, 45], [0, 6, 12, 18, 24, 30, 36, 42, 48, 54], [0, 7, 14, 21, 28, 35, 42, 49, 56, 63], [0, 8, 16, 24, 32, 40, 48, 56, 64, 72], [0, 9, 18, 27, 36, 45, 54, 63, 72, 81]]

戻る

if分岐出力

['出力式' for '変数' in range() if '条件文' ]
 条件文がfor文の後に来る。if..elseの2分岐以上の時と順番が違うので注意。
if文を使って偶数だけをリスト出力する例。

ListComprehension.py
out_list = [i for i in range(50) if i%2==0]
print(out_list)

出力結果

[0, 2, 4, 6, 8]

戻る

2分岐以上出力

['ifの出力式' if '条件文' else 'elseの出力式' for '変数' in range()]
 条件文含めfor文の前に来る。if分岐出力と順番が違うので注意。
if/else文を使って偶数ならば '数値_even' 奇数ならば '数値_odd'をリスト出力する例。

ListComprehension.py
#偶数ならば '数値_even' 奇数ならば '数値_odd'をリスト出力
out_list = [(str(i)+'_even') if(i%2==0) else (str(i)+'_odd') for i in range(50)]
print(out_list)

出力結果

['0_even', '1_odd', '2_even', '3_odd', '4_even', '5_odd', '6_even', '7_odd', '8_even', '9_odd']

 内包表記は、elifが使えないので、3分岐以上の条件文にしたい場合は、elseの中に if/elseを入れ子表記することになる。ただ、コードとしては見にくい。

ListComprehension.py 
#文字列ならば '数値_str' 偶数ならば '数値_even' 奇数ならば '数値_odd'をリスト出力
in_list=[0,1,2,3,'4','5',6,7,8,9]
out_list = [(i+'_str') if(type(i)==str) else ( (str(i)+'_even') if(i%2==0) else (str(i)+'_odd') )  for i in in_list]
print(out_list)

#こちらと同じ-----------------------------------------
in_list=[0,1,2,3,'4','5',6,7,8,9]
out_list=[]
for i in in_list:
	if(type(i)==str):
		out_list.append(i+'_str')
	elif(i%2==0):
		out_list.append(str(i)+'_even')
	else:
		out_list.append(str(i)+'_odd')
print(out_list)

出力結果

['0_even', '1_odd', '2_even', '3_odd', '4_str', '5_str', '6_even', '7_odd', '8_even', '9_odd']

戻る

タプル出力

tuple('出力式' for '変数' in range())
内包表記はタプル出力も可能。偶数のタプル出力する例。

ListComprehension.py
out_list = tuple(i*2 for i in range(10))
print(out_list)

出力結果

(0, 2, 4, 6, 8, 10, 12, 14, 16, 18)

戻る

辞書出力

{key : value for '変数' in range()}
 内包表記は辞書出力も可能。enumerateを使ってリストを採番して辞書出力することもできるし、zipとの組み合わせで2つのリストから辞書作成することもできる。

ListComprehension.py
#enumerateを使ってリストを採番して辞書化
in_list_value=['','','','','','','','','','']
out_dict = {i:v for i,v in enumerate(in_list_value)}
print('enumerate:',out_dict)

#zipを使って2つのリストから辞書化
in_list_key=[0,1,2,3,4,5,6,7,8,9]
in_list_value=['','','','','','','','','','']
out_dict = {k:v for k,v in zip(in_list_key,in_list_value)}
print('zip:',out_dict)

出力結果

enumerate: {0: '', 1: '', 2: '', 3: '', 4: '', 5: '', 6: '', 7: '', 8: '', 9: ''}

zip: {0: '', 1: '', 2: '', 3: '', 4: '', 5: '', 6: '', 7: '', 8: '', 9: ''}

戻る

分岐と辞書組み合わせ

{ ('key用の分岐式') : ('value用の分岐式') for '変数' in range() }
 偶数ならeven 奇数ならoddとする辞書。

ListComprehension.py
out_dict = { k:('even' if(k%2==0) else 'odd')  for k in range(10)}
print(out_dict)

出力結果

{0: 'even', 1: 'odd', 2: 'even', 3: 'odd', 4: 'even', 5: 'odd', 6: 'even', 7: 'odd', 8: 'even', 9: 'odd'}

戻る

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