私は次のようなリストを持っています
[
[1, 2, 3],
[4, 5, 6],
[7],
[8, 9]
]
どうすれば平らにできますか[1, 2, 3, 4, 5, 6, 7, 8, 9]
?
リストのリストがネストされたリストの内包表記から来ている場合は、内包表記を修正することで、より簡単に、直接的に問題を解決できます。ネストされたリストではなく、リストの理解からフラットな結果を取得するにはどうすればよいでしょうか?。
ここで最も一般的な解決策は、通常、ネストされたリストの 1 つの「レベル」のみをフラット化します。不規則な(任意にネストされた)リストのリストをフラット化する深くネストされた構造を完全に平坦化するソリューション(一般的には再帰的に)
ベストアンサー1
ネストされたリストを使用して、リストをxss
フラット化することができます。リストの理解:
flat_list = [
x
for xs in xss
for x in xs
]
上記は以下と同等です:
flat_list = []
for xs in xss:
for x in xs:
flat_list.append(x)
対応する関数は次のとおりです。
def flatten(xss):
return [x for xs in xss for x in xs]
これは最も速い方法です。証拠として、timeit
標準ライブラリのモジュールには次のように表示されます。
$ python -mtimeit -s'xss=[[1,2,3],[4,5,6],[7],[8,9]]*99' '[x for xs in xss for x in xs]'
10000 loops, best of 3: 143 usec per loop
$ python -mtimeit -s'xss=[[1,2,3],[4,5,6],[7],[8,9]]*99' 'sum(xss, [])'
1000 loops, best of 3: 969 usec per loop
$ python -mtimeit -s'xss=[[1,2,3],[4,5,6],[7],[8,9]]*99' 'reduce(lambda xs, ys: xs + ys, xss)'
1000 loops, best of 3: 1.1 msec per loop
説明: に基づくメソッド+
( での暗黙の使用を含むsum
) は、必然的に、O(L**2)
L 個のサブリストがある場合に、中間結果リストが長くなり続けるため、各ステップで新しい中間結果リスト オブジェクトが割り当てられ、以前の中間結果のすべての項目がコピーされる必要があります (最後にいくつかの新しい項目が追加されることもあります)。したがって、簡単にするために、一般性を実際に失うことなく、それぞれ M 個の項目を持つ L 個のサブリストがあるとします。最初の M 個の項目は M 個ずつコピーされL-1
、2 番目の項目はL-2
M 個ずつコピーされます。コピーの合計数は、1 から L までの x を除く x の合計の M 倍、つまり ですM * (L**2)/2
。
リストの理解では、リストを 1 回だけ生成し、各項目を (元の場所から結果リストに) 1 回だけコピーします。