はじめに
本ページでは、上図のように多次元で不整形なリストの合計値などを求める方法を説明します。
数値のみが入ったPythonのリストであればsum関数で合計値を求めたり、max関数で最大値を求めることができますが、リストの中にリストが入った2次元や3次元のリストの合計値などを直接計算できる関数はありません。では、ではどうすれば良いのでしょうか。
1次元のリストに変換することを考える
まず、目的のリストを1次元に変換することを考えます。1次元に変換すればsumやmaxといった関数が使用できるからです。
1次元化の関数を作る
def flatten(c:'list, tuple, set') -> list:
"""多次元のリスト、タプル、集合を1次元化したリストを返却"""
lst = []
for e in c:
if type(e) in (list, tuple, set):
lst += flatten(e)
else:
lst += [e]
return lst
この関数の引数にリストを渡すと、要素を走査しながらリストを作り直します。途中でリストの要素を見つけると、関数を再帰呼び出しして、1次元化するよう依頼します。そして、再帰呼び出しした関数から返却された1次元のリストを作成中のリストに加えます。このようにして1次元のリストを完成させます。
なお、この関数はリストだけではなくタプルや集合、あるいは、それらの混ざったものであっても機能します。
合計値などの計算例
>>> lst = [[3, 1, 8, 5],
[9, 4, [3, 8]],
[[6,3]],
[8, 7]]
>>> lst_flat = flatten(lst)
>>> lst_flat
[3, 1, 8, 5, 9, 4, 3, 8, 6, 3, 8, 7]
>>> sum(lst_flat) # 合計値
65
>>> max(lst_flat) # 最大値
9
>>> min(lst_flat) # 最小値
1
>>> sum(lst_flat)/len(lst_flat) # 平均値
5.416666666666667
このようにして、上図に示した多次元で不整形なリストの合計値、最大値の他、最小値や平均値も求めることができました。
関連項目
リスト(list)の生成方法、演算子、関数