[解決済み] リストのリストからフラットなリストを作るには?
2022-03-15 15:55:06
質問
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
.
リスト内包はただ一度だけリストを生成し、各項目を(元の場所から結果のリストへ)正確に一度だけコピーします。
関連
-
[解決済み】Django: ImproperlyConfigured: SECRET_KEY 設定は空であってはならない
-
[解決済み】TypeError: 系列を <class 'float'> に変換することができません。
-
[解決済み] リスト内のアイテムのインデックスを検索する
-
[解決済み] 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 実装 サイバーパンク風ボタン
おすすめ
-
PythonによるLeNetネットワークモデルの学習と予測
-
ピロウズ画像色処理の具体的な活用方法
-
Pythonによるjieba分割ライブラリ
-
Pythonコードの可読性を向上させるツール「pycodestyle」の使い方を詳しく解説します
-
[解決済み】RuntimeWarning: invalid value encountered in double_scalars で numpy の除算ができない。
-
[解決済み】TypeErrorを取得しました。エントリを持つ子テーブルの後に親テーブルを追加しようとすると、 __init__() missing 1 required positional argument: 'on_delete'
-
[解決済み】Python Error: "ValueError: need more than 1 value to unpack" (バリューエラー:解凍に1つ以上の値が必要です
-
[解決済み】Python - "ValueError: not enough values to unpack (expected 2, got 1)" の修正方法 [閉店].
-
[解決済み] Pythonで浅いリストを平坦にする [重複] [重複
-
[解決済み] Pythonでリストのリストを結合する [重複]。