[解決済み] リストのリストからフラットなリストを作るには?
2022-03-03 20:03:04
質問
Pythonでリストのリストから単純なリストを作るショートカットはありますか?
でできるんだけど
for
しかし、何かクールなワンライナーはないでしょうか?
で試してみました。
functools.reduce()
:
from functools import reduce
l = [[1, 2, 3], [4, 5, 6], [7], [8, 9]]
reduce(lambda x, y: x.extend(y), l)
でも、こんなエラーが出ます。
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <lambda>
AttributeError: 'NoneType' object has no attribute 'extend'
解決方法は?
リストのリストがある場合
t
,
flat_list = [item for sublist in t for item in sublist]
という意味になります。
flat_list = []
for sublist in t:
for item in sublist:
flat_list.append(item)
は、これまで掲載したショートカットよりも高速です。(
t
はフラット化するリストです)。
以下は対応する関数です。
def flatten(t):
return [item for sublist in t for item in sublist]
その証拠に
timeit
モジュールが標準ライブラリに含まれています。
$ python -mtimeit -s't=[[1,2,3],[4,5,6], [7], [8,9]]*99' '[item for sublist in t for item in sublist]'
10000 loops, best of 3: 143 usec per loop
$ python -mtimeit -s't=[[1,2,3],[4,5,6], [7], [8,9]]*99' 'sum(t, [])'
1000 loops, best of 3: 969 usec per loop
$ python -mtimeit -s't=[[1,2,3],[4,5,6], [7], [8,9]]*99' 'reduce(lambda x,y: x+y,t)'
1000 loops, best of 3: 1.1 msec per loop
説明
+
(での暗黙の使用も含む)。
sum
)は、必然的に
O(T**2)
中間結果リストが長くなると、各ステップで新しい中間結果リストオブジェクトが 割り当てられ、前の中間結果のすべての項目がコピーされなければなりません (さらに最後にいくつかの新しい項目が追加されます)。そこで、簡単のために、また実際に一般性を失うことなく、それぞれk個の項目からなるT個のサブリストがあるとします。最初のk個の項目はT-1回、2番目のk個の項目はT-2回、・・・とコピーして行き、コピー回数は1からTまでのxの合計のk倍になります、即ち。
k * (T**2)/2
.
リスト内包はただ一度だけリストを生成し、各項目を(元の場所から結果のリストへ)正確に一度だけコピーします。
関連
-
任意波形を生成してtxtで保存するためのPython実装
-
[解決済み】csv.Error:イテレータはバイトではなく文字列を返すべき
-
[解決済み] リスト内のアイテムのインデックスを検索する
-
[解決済み] Pythonで2つのリストを連結する方法は?
-
[解決済み] リストが空かどうかを確認するにはどうすればよいですか?
-
[解決済み] Pythonのリストメソッドであるappendとextendの違いは何ですか?
-
[解決済み] 割り当て後にリストが予期せず変更されました。その理由と防止策を教えてください。
-
[解決済み] リストを均等な大きさの塊に分割するには?
-
[解決済み] リストの最後の要素を取得する方法
-
[解決済み] リストの要素数を取得する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
PyQt5はユーザーログインGUIインターフェースとログイン後のジャンプを実装しています。
-
Python入門 openを使ったファイルの読み書きの方法
-
Pythonの@decoratorsについてまとめてみました。
-
FacebookオープンソースワンストップサービスpythonのタイミングツールKats詳細
-
[解決済み】ImportError: sklearn.cross_validation という名前のモジュールがない。
-
[解決済み】「RuntimeError: dictionary changed size during iteration」エラーを回避する方法とは?
-
[解決済み】TypeErrorを取得しました。エントリを持つ子テーブルの後に親テーブルを追加しようとすると、 __init__() missing 1 required positional argument: 'on_delete'
-
[解決済み】ValueError: xとyは同じサイズでなければならない
-
[解決済み] Pythonで浅いリストを平坦にする [重複] [重複
-
[解決済み] Pythonでリストのリストを結合する [重複]。