[解決済み】述語にマッチするシーケンスの最初の要素を探す
2022-04-05 23:16:04
質問
ある述語にマッチするリストの最初の要素を見つけるためのイディオム的な方法が欲しい。
現在のコードはかなり醜いです。
[x for x in seq if predicate(x)][0]
に変えようと思ったことがあります。
from itertools import dropwhile
dropwhile(lambda x: not predicate(x), seq).next()
でも、もっとエレガントなものがあるはず...。そして、もしそれが
None
の値は、一致するものがない場合に例外を発生させるのではありません。
みたいな関数を定義すればいいんだろうけど。
def get_first(predicate, seq):
for i in seq:
if predicate(i): return i
return None
しかし、すでに同じものを提供しているビルトインがあるのなら、このようにユーティリティ関数でコードを埋め始めるのはかなり味気ないです(そして、人々はおそらくそれがすでにあることに気づかないので、時間とともに繰り返される傾向にあります)。
どのように解決するのか?
配列の最初の要素を見つけるには
seq
にマッチする
predicate
:
next(x for x in seq if predicate(x))
あるいは単純に
Python 2 :
next(itertools.ifilter(predicate, seq))
パイソン3 :
next(filter(predicate, seq))
これらは
StopIteration
例外は、述語がどの要素にもマッチしない場合に発生します。
を返すには
None
そのような要素がない場合
next((x for x in seq if predicate(x)), None)
または
next(filter(predicate, seq), None)
関連
-
Python機械学習Githubが8.9Kstarsに達したモデルインタープリタLIME
-
Python 可視化 big_screen ライブラリ サンプル 詳細
-
Pythonコードの可読性を向上させるツール「pycodestyle」の使い方を詳しく解説します
-
Pythonショートビデオクローラーチュートリアル
-
[解決済み] TypeError: 'DataFrame' オブジェクトは呼び出し可能ではない
-
[解決済み】django インポートエラー - core.managementという名前のモジュールがない
-
[解決済み] リスト内のある要素の出現回数をすべて見つける方法
-
[解決済み] イテレートから条件に合致する最初の項目を取得する
-
[解決済み] Pythonで正規表現にマッチするものをすべて見つけるにはどうしたらいいですか?
-
[解決済み] 常にtrueを返すJava 8の組み込み述語?
最新
-
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を使ったオフィス自動化コード例
-
Python Decorator 練習問題
-
PythonはWordの読み書きの変更操作を実装している
-
Python jiabaライブラリの使用方法について説明
-
Python 可視化 big_screen ライブラリ サンプル 詳細
-
Pythonの学習とデータマイニングのために知っておくべきターミナルコマンドのトップ10
-
[解決済み】RuntimeWarning: invalid value encountered in double_scalars で numpy の除算ができない。
-
[解決済み】OSError: [WinError 193] %1 は有効な Win32 アプリケーションではありません。
-
[解決済み】 AttributeError("'str' object has no attribute 'read'")