Pythonの内包表記

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

# 一覧
|用途|表記|
|---|---|
|[リスト出力](#リスト出力)|```['出力式' for '変数' in range()]```|
|[2次元リスト出力](#2次元リスト出力)|```[['出力式' for '変数' in range()] for '変数' in range()]```|
|[if分岐出力](#if分岐出力)|```['出力式' for '変数' in range() if '条件文' ]```|
|[2分岐以上出力](#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()]
　偶数のリスト出力する例。
```Python:ListComprehension.py
out_list = [i*2 for i in range(10)]
print(out_list)
```
出力結果
```Python:
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
```
[戻る](#一覧)



# 2次元リスト出力
[['出力式' for '変数' in range()] for '変数' in range()]
　2次元リスト出力する例。
```Python:ListComprehension.py
out_list = [[i*j for j in range(10)] for i in range(10)]
print(out_list)
```
出力結果
```Python:
[[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文を使って偶数だけをリスト出力する例。
```Python:ListComprehension.py
out_list = [i for i in range(50) if i%2==0]
print(out_list)
```
出力結果
```Python:
[0, 2, 4, 6, 8]
```
[戻る](#一覧)



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

```Python: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)
```
出力結果
```Python:
['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を入れ子表記することになる。ただ、コードとしては見にくい。

```Python: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)
```
出力結果
```Python:
['0_even', '1_odd', '2_even', '3_odd', '4_str', '5_str', '6_even', '7_odd', '8_even', '9_odd']
```
[戻る](#一覧)



# タプル出力
tuple('**出力式**' for '**変数**' in range())
 内包表記はタプル出力も可能。偶数のタプル出力する例。
```Python:ListComprehension.py
out_list = tuple(i*2 for i in range(10))
print(out_list)
```
出力結果
```Python:
(0, 2, 4, 6, 8, 10, 12, 14, 16, 18)
```
[戻る](#一覧)



# 辞書出力
{key : value for '**変数**' in range()}
　内包表記は辞書出力も可能。enumerateを使ってリストを採番して辞書出力することもできるし、zipとの組み合わせで2つのリストから辞書作成することもできる。
```Python: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)
```
出力結果
```Python:
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とする辞書。
```Python:ListComprehension.py
out_dict = { k:('even' if(k%2==0) else 'odd')  for k in range(10)}
print(out_dict)
```
出力結果
```Python:
{0: 'even', 1: 'odd', 2: 'even', 3: 'odd', 4: 'even', 5: 'odd', 6: 'even', 7: 'odd', 8: 'even', 9: 'odd'}
```
[戻る](#一覧)