Pythonの内包表記

### 1. 内包表記(list)

この表記法は計算速度も速く、コードもすっきりするので覚えたほうが良いと思う記法です。  

まずは、リストで作られた各値の計算


```python
base = [0, 1, 2, 3, 4]
ret_List = []
for i in base:
    ret_List.append(i*2)
print('通常表記：', ret_List)

ret_List_comp = [i * 2 for i in base]
print('内包表記：', ret_List_comp)
```

    通常表記： [0, 2, 4, 6, 8]
    内包表記： [0, 2, 4, 6, 8]
    

ただ、数値を扱う場合には`numpy`を使ったほうが良いと思います。


```python
import numpy as np
```


```python
base_np = np.array([0, 1, 2, 3, 4])
ret_List = base_np * 2
print('numpy：', ret_List)
```

    numpy： [0 2 4 6 8]
    

ということで、文字列を使った場合(やることは基本同じですが)によく使います。


```python
List = ['NetSalesIFRS', 'NetSales', 'NetSalesUS']

# NetSalesを売上高に変換(通常表記)
ret_List = []
for i in List:
    ret_List.append(i.replace('NetSales', '売上高'))
print('通常表記：', ret_List)

# NetSalesを売上高に変換(内包表記)
ret_List_comp = [i.replace('NetSales', '売上高') for i in List]
print('内包表記：', ret_List_comp)
```

    通常表記： ['売上高IFRS', '売上高', '売上高US']
    内包表記： ['売上高IFRS', '売上高', '売上高US']
    

特定の文字列を含む場合は`for文`の後に`if文`を入れることで対応でき来ます。


```python
List = ['NetSalesIFRS', 'NetSales', 'NetSalesUS',
        'OperatingIncomeIFRS', 'OperatingIncome', 'OperatingIncomeUS']

# IFRSを含む文字列の抽出(通常表記)
ret_List = []
for i in List:
    if 'IFRS' in i:
        ret_List.append(i)
print('通常表記：', ret_List)

# IFRSを含む文字列の抽出(内包表記)
ret_List_comp = [i for i in List if 'IFRS' in i]
print('内包表記：', ret_List_comp)
```

    通常表記： ['NetSalesIFRS', 'OperatingIncomeIFRS']
    内包表記： ['NetSalesIFRS', 'OperatingIncomeIFRS']
    

リストが階層になっている場合でも内包表記は使えます。


```python
List = [['NetSalesIFRS', 'NetSales', 'NetSalesUS'],
        ['OperatingIncomeIFRS', 'OperatingIncome', 'OperatingIncomeUS']]

# IFRSとUSを含まない文字列の抽出(通常表記)
ret_List = []
for i in List:
    for j in i:
        if ('IFRS' not in j) and ('US' not in j):
            ret_List.append(j)
print('通常表記：', ret_List)

# IFRSとUSを含まない文字列の抽出(内包表記)
ret_List_comp = [j for i in List for j in i if ('IFRS' not in j) and ('US' not in j)]
print('内包表記：', ret_List_comp)
```

    通常表記： ['NetSales', 'OperatingIncome']
    内包表記： ['NetSales', 'OperatingIncome']
    

2回for文を回すような時にも使えますが、1行が長くなる事があるので、短くなる工夫もあったほうが良いと思います。
例えば、上記の場合は判定条件を`lambda`で別行にするとかの方法もあります。


```python
List = [['NetSalesIFRS', 'NetSales', 'NetSalesUS'],
        ['OperatingIncomeIFRS', 'OperatingIncome', 'OperatingIncomeUS']]
jdg = lambda j :('IFRS' not in j) and ('US' not in j)
ret_List_comp_lambda = [j for i in List for j in i if jdg(j)]
print('内包表記(ラムダ)：', ret_List_comp)
```

    内包表記(ラムダ)： ['NetSales', 'OperatingIncome']
    

### 2.内包表記(dict)
辞書を作成するときも、内包表記が使えます。


```python
List = [['NetSalesIFRS', 'NetSales', 'NetSalesUS'],
        ['OperatingIncomeIFRS', 'OperatingIncome', 'OperatingIncomeUS'],
        ['OperatingIncomeToSalesRatioIFRS', 'OperatingIncomeToNetSalesRatio', 'OperatingIncomeToNetSalesRatioUS']]
key = ['売上高', '営業利益', '営業利益率']

ret_Dict = {}
for k, v in zip(key, List):
    ret_Dict[k] = v
print('通常表記：', ret_Dict)

ret_Dict_comp = {k: v for k, v in zip(key, List)}
print('内包表記：', ret_Dict_comp)
```

    通常表記： {'売上高': ['NetSalesIFRS', 'NetSales', 'NetSalesUS'], '営業利益': ['OperatingIncomeIFRS', 'OperatingIncome', 'OperatingIncomeUS'], '営業利益率': ['OperatingIncomeToSalesRatioIFRS', 'OperatingIncomeToNetSalesRatio', 'OperatingIncomeToNetSalesRatioUS']}
    内包表記： {'売上高': ['NetSalesIFRS', 'NetSales', 'NetSalesUS'], '営業利益': ['OperatingIncomeIFRS', 'OperatingIncome', 'OperatingIncomeUS'], '営業利益率': ['OperatingIncomeToSalesRatioIFRS', 'OperatingIncomeToNetSalesRatio', 'OperatingIncomeToNetSalesRatioUS']}
    

辞書のフォーマットを作ったりするときにも使えます。


```python
l = ['A', 'B', 'C']
m = ['a', 'b', 'c']
Dict = {k: {kk: [] for kk in m} for k in l }
print(Dict)
```

    {'A': {'a': [], 'b': [], 'c': []}, 'B': {'a': [], 'b': [], 'c': []}, 'C': {'a': [], 'b': [], 'c': []}}