はじめに
内包表記は、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()]
偶数のリスト出力する例。
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次元リスト出力する例。
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文を使って偶数だけをリスト出力する例。
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'をリスト出力する例。
#偶数ならば '数値_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を入れ子表記することになる。ただ、コードとしては見にくい。
#文字列ならば '数値_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())
内包表記はタプル出力も可能。偶数のタプル出力する例。
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つのリストから辞書作成することもできる。
#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とする辞書。
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'}