整数のリストがあり、すべての要素が指定された制限よりも小さい新しいリストを作成したいと思います。
a=range(15) #example list
limit=9 #example limit
この問題を解決するための私のアプローチは
[i for i in a if i < limit]
私には、最初の「i foriin」はかなり冗長に見えます。Pythonでより良い実装はありますか?
整数のリストがあり、すべての要素が指定された制限よりも小さい新しいリストを作成したいと思います。
a=range(15) #example list
limit=9 #example limit
この問題を解決するための私のアプローチは
[i for i in a if i < limit]
私には、最初の「i foriin」はかなり冗長に見えます。Pythonでより良い実装はありますか?
あなたはフィルターを使うことができます
>>> filter(lambda i: i < limit, a)
[0, 1, 2, 3, 4, 5, 6, 7, 8]
しかし、リスト内包はそれを行うための好ましい方法です
これは、Pythonドキュメントがこれについて言っていることです:
リスト内包表記は、map()、filter()、および/またはラムダを使用せずにリストを作成するための簡潔な方法を提供します。結果として得られるリスト定義は、これらの構成を使用して作成されたリストよりも明確になる傾向があります。
これはあなたができる最善のことです。フィルターを使えばもっとうまくいくかもしれませんが、私はお勧めしません。リスト内包表記はほとんど英語のように読めることに注意してください:「ifor i in a ifi<limit」。これにより、少し冗長な面があれば、読みやすく、理解しやすくなります。
filter()を使用できます(少なくともPython2.xシリーズでは...3.0で削除された可能性があります)
newlist = filter(lambda item: item < limit, oldlist)
最初の引数は任意の呼び出し可能であり(その結果はブール値に強制変換されるため、とにかくブール値を返す呼び出し可能オブジェクトを使用するのが最善です)、2番目の引数は任意のシーケンスにすることができます。
より良いバージョンはボイラープレートコードを必要とするので、リスト内包表記はあなたが得ることができるのと同じくらい素晴らしいです。
これは、それを行うための1つの異なる方法になります。
from operator import ge
from functools import partial
filter(partial(ge, limit), a)
(しかし、もしあなたがそれを使うならfilter
、ナディアの方法はそれをする明白な方法でしょう)