[解決済み] リスト内包とラムダ+フィルタの比較
質問
たまたま、基本的なフィルタリングの必要性に気がつきました。リストがあり、それを項目の属性でフィルタリングする必要があります。
私のコードは次のようなものでした。
my_list = [x for x in my_list if x.attribute == value]
でも、こう書いた方がいいんじゃないかと思ったんです。
my_list = filter(lambda x: x.attribute == value, my_list)
この方が読みやすいし、パフォーマンスのために必要なら、ラムダを抜いて何かを得ることもできる。
質問ですが、2番目の方法を使う場合の注意点はありますか?パフォーマンスの違いはありますか?私はPythonic Way™を完全に見逃しており、さらに別の方法(ラムダの代わりにitemgetterを使うなど)で行うべきでしょうか?
どのように解決するのですか?
人によって美しさが違うのは不思議なものです。私は、リスト理解のほうが
filter
+
lambda
が、使いやすいほうを選んでください。
の使用を遅くする可能性があるのは、次の2つです。
filter
.
1つ目は、関数呼び出しのオーバーヘッドです。Pythonの関数を使用するとすぐに(それが
def
または
lambda
) フィルターはリスト内包より遅くなる可能性があります。しかし、その差は歴然としています。
もう1つのオーバーヘッドは、ラムダがスコープ付き変数(
value
). これはローカル変数にアクセスするよりも遅く、Python 2.xではリスト内包はローカル変数にしかアクセスしません。Python 3.xを使用している場合、リスト内包は別の関数で実行されます。
value
はクロージャを経由するため、この違いは適用されません。
もう一つの選択肢は、リスト内包の代わりにジェネレータを使うことです。
def filterbyvalue(seq, value):
for el in seq:
if el.attribute==value: yield el
そしてメインコードでは(読みやすさが本当に重要なところです)、リスト内包とフィルタの両方を、できれば意味のある関数名に置き換えています。
関連
-
[解決済み】OSError: [WinError 193] %1 は有効な Win32 アプリケーションではありません。
-
[解決済み] リストのリストからフラットなリストを作るには?
-
[解決済み] リスト内のアイテムのインデックスを検索する
-
[解決済み] リストが空かどうかを確認するにはどうすればよいですか?
-
[解決済み] 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 人工知能 人間学習 描画 機械学習モデル作成
-
PicgoのイメージベッドツールをPythonで実装する
-
Pythonコードの可読性を向上させるツール「pycodestyle」の使い方を詳しく解説します
-
pyCaret効率化乗算器 オープンソース ローコード Python機械学習ツール
-
[解決済み】なぜ「LinAlgError: Grangercausalitytestsから「Singular matrix」と表示されるのはなぜですか?
-
[解決済み】Pythonスクリプトで「Expected 2D array, got 1D array instead: 」というエラーが発生?
-
[解決済み】syntaxError: 'continue' がループ内で適切に使用されていない
-
[解決済み】インポートエラー。モジュール名 urllib2 がない
-
[解決済み】Python Error: "ValueError: need more than 1 value to unpack" (バリューエラー:解凍に1つ以上の値が必要です
-
[解決済み] Pythonの一行 "for "式 [重複]。