1. 内包表記(list)
この表記法は計算速度も速く、コードもすっきりするので覚えたほうが良いと思う記法です。
まずは、リストで作られた各値の計算
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
を使ったほうが良いと思います。
import numpy as np
base_np = np.array([0, 1, 2, 3, 4])
ret_List = base_np * 2
print('numpy:', ret_List)
numpy: [0 2 4 6 8]
ということで、文字列を使った場合(やることは基本同じですが)によく使います。
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文
を入れることで対応でき来ます。
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']
リストが階層になっている場合でも内包表記は使えます。
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
で別行にするとかの方法もあります。
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)
辞書を作成するときも、内包表記が使えます。
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']}
辞書のフォーマットを作ったりするときにも使えます。
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': []}}