filter
否定を伴う aの最も慣用的な書き方は?
例:
is_even= lambda x : x % 2 == 0
odd_numbers= filter( lambda x: not is_even(x), range(10) )
もちろん、リスト内包表記を使用することもできますが、filter
とにかく使用する必要はありません
誰かが疑問に思っている場合に備えて、条件に基づいてリストを分割しようとしているときにこれに出くわしました
filter
否定を伴う aの最も慣用的な書き方は?
例:
is_even= lambda x : x % 2 == 0
odd_numbers= filter( lambda x: not is_even(x), range(10) )
もちろん、リスト内包表記を使用することもできますが、filter
とにかく使用する必要はありません
誰かが疑問に思っている場合に備えて、条件に基づいてリストを分割しようとしているときにこれに出くわしました
itertools
モジュールにはifilter()とifilterfalse( )の両方が含まれてTrue
おり、それぞれ関数が返す要素をフィルタリングしFalse
ます。
odd_numbers = ifilterfalse(is_even, range(10))
filter
Python 2 では、 と の間に違いがあることに注意してくださいifilter
。odd_numbers
ここではイテレータになりますが、filter() はリストを返します ( itertools.ifilter 対 filter 対 list 内包表記を参照)。実際にリストを作成したい場合はnot
、使用するように設定されていると仮定すると、使用例は問題ないように見えますfilter
-リスト内包表記はより「慣用的」である可能性があります(リストフィルタリング:リスト内包表記とラムダ+フィルター)。
Python 3 では、filter()はリストではなく反復子を構築し、itertools.filterfalse()は補数です。
述語に基づく分割は a と呼ばれpartition
ます。partition
特に奇数と偶数の内部を繰り返すよりも、別の関数として実装する方が慣用的だと思います。Python 3 のItertools Recipesには、次の実装があります。
def partition(pred, iterable):
'Use a predicate to partition entries into false entries and true entries'
# partition(is_odd, range(10)) --> 0 2 4 6 8 and 1 3 5 7 9
t1, t2 = tee(iterable)
return filterfalse(pred, t1), filter(pred, t2)
それはfilterfalse
(@Lackで説明されているように)使用tee
し、そのモジュールで定義されています。したがって、最高レベルのコードは次のようになります。
odds, evens = partition(is_even, range(10))