6

filter否定を伴う aの最も慣用的な書き方は?

例:

is_even= lambda x : x % 2 == 0
odd_numbers= filter( lambda x: not is_even(x), range(10) )

もちろん、リスト内包表記を使用することもできますが、filterとにかく使用する必要はありません

誰かが疑問に思っている場合に備えて、条件に基づいてリストを分割しようとしているときにこれに出くわしました

4

2 に答える 2

10

itertoolsモジュールにはifilter()ifilterfalse( )の両方が含まれてTrueおり、それぞれ関数が返す要素をフィルタリングしFalseます。

odd_numbers = ifilterfalse(is_even, range(10))

filterPython 2 では、 と の間に違いがあることに注意してくださいifilterodd_numbersここではイテレータになりますが、filter() はリストを返します ( itertools.ifilter 対 filter 対 list 内包表記を参照)。実際にリストを作成したい場合はnot、使用するように設定されていると仮定すると、使用例は問題ないように見えますfilter-リスト内包表記はより「慣用的」である可能性があります(リストフィルタリング:リスト内包表記とラムダ+フィルター)。

Python 3 では、filter()はリストではなく反復子を構築し、itertools.filterfalse()は補数です。

于 2015-01-09T19:14:54.863 に答える
3

述語に基づく分割は 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))
于 2015-01-09T19:37:57.750 に答える