はい、このテーマは以前にも取り上げられたことがあることは知っています。
- 有限反復可能オブジェクトの無限反復可能オブジェクトを連鎖(平坦化)する Python イディオムはありますか?
- Python で浅いリストをフラット化する
- シーケンスのシーケンスを平坦化するための理解?
- リストのリストからフラット リストを作成するにはどうすればよいですか?
しかし、私の知る限り、1 つを除くすべてのソリューションは、[[[1, 2, 3], [4, 5]], 6]
目的の出力が[1, 2, 3, 4, 5, 6]
(または、おそらくイテレータ)である のようなリストでは失敗します。
任意のネストに機能する唯一の解決策は、この質問では:
def flatten(x):
result = []
for el in x:
if hasattr(el, "__iter__") and not isinstance(el, basestring):
result.extend(flatten(el))
else:
result.append(el)
return result
これは最善のアプローチでしょうか? 何か見落としているのでしょうか? 何か問題がありますか?
ベストアンサー1
ジェネレータ関数を使用すると、例が読みやすくなり、パフォーマンスが向上します。
Python 2
使用方法Iterable
ABC2.6 で追加:
from collections import Iterable
def flatten(xs):
for x in xs:
if isinstance(x, Iterable) and not isinstance(x, basestring):
for item in flatten(x):
yield item
else:
yield x
Python3 について
Python 3では、basestring
はなくなりましたが、タプルは(str, bytes)
同じ効果をもたらします。また、yield from
演算子はジェネレータからアイテムを 1 つずつ返します。
from collections.abc import Iterable
def flatten(xs):
for x in xs:
if isinstance(x, Iterable) and not isinstance(x, (str, bytes)):
yield from flatten(x)
else:
yield x