Pythonによる多次元リストを一次元に平坦化
前置き
@ahpjop 様の「自作Python100本ノック」を解いていて、Q14が勉強になったので記事にまとめました。
コード
flat.py
def flat(l):
res = []
for i in l:
if type(i) is list:
res.extend(flat(i))
else:
res.append(i)
return res
a = [1,2,[3,4],5,[6,[7,[[8,9]]]]]
print(flat(a))
# 実行結果
[1, 2, 3, 4, 5, 6, 7, 8, 9]
説明
ここでは、appendメソッドとextendメソッドが重要になります。
公式ドキュメントより
-
appendメソッド
list.append(x)
リストの末尾に要素を一つ追加します。a[len(a):] = [x] と等価です。 -
extendメソッド
list.extend(iterable)
イテラブルのすべての要素を対象のリストに追加し、リストを拡張します。a[len(a):] = iterable と等価です。
sample.py
a=[]
a.append(1)
#[1]
a.append([2])
#[1,2]
a.append('ai')
#[1,2,'a','i']
今回の場合、リストの要素が数字ならそのままresに追加し、リストならresを拡張しているわけです。これにより、多次元リストを一次元に平坦化しています。