5

フィルター関数は、特定の関数に対して true を返す要素のサブリストを返します。リスト全体を再度調べずに、別のリストで false を返す要素のリストを取得することは可能ですか?

例:

trueList,falseList = someFunc(trueOrFalseFunc,list)

PS:2つの空のリストを初期化し、関数の戻り値に基づいてそれぞれに要素を追加することで実行できることを知っています。検討中のリストは非常に巨大になる可能性があり、true を返す可能性のある要素はほとんどない可能性があります。追加機能はコストがかかるため、より良い方法はありますか?

4

4 に答える 4

5

イテレータを使用して、これを試してください。

from itertools import tee

def partition(lst, pred):
    l1, l2 = tee((pred(e), e) for e in lst)
    return (x for cond, x in l1 if cond), (x for cond, x in l2 if not cond)

このように使用し、返される値はイテレータであることを忘れないでください。

lst = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
evens, odds = partition(lst, lambda x: x%2 == 0)

何らかの理由でリストが必要な場合は、次のようにします。

list(evens)
> [0, 2, 4, 6, 8]
list(odds)
> [1, 3, 5, 7, 9]
于 2012-04-09T21:04:07.567 に答える
3
def someFunc(trueorfalsefunc, l):
    trueList = []
    falseList = []
    for item in l:
        if trueorfalsefunc(item):
            trueList.append(item)
        else:
            falseList.append(item)
    return trueList, falseList

たとえば、次のようになります。

>>> someFunc(bool, [1,2,0,"", "a"])
([1, 2, 'a'], [0, ''])
于 2012-04-09T20:38:06.060 に答える
2

ワンライナーに行きたい場合は、これを行うことができます:(Niklas B.が読みやすさを改善するために提案したように、辞書からリストに切り替えています)

>>> some_list=[True, False, True, False, False]
>>> reduce(lambda (true,false),x: (true + [x], false) if x else (true, false + [x]), some_list, ([],[]))
([True, True], [False, False, False])
于 2012-04-09T20:41:23.647 に答える
1

ジェネレーターの内包表記を使用できます。これにより、パフォーマンスが向上し、よりクリーンなコードが促進されます。ただし、これでプログラムの残りの部分が満足できるものになるかどうかはわかりません。これらの返された結果をどのように使用しているかによって異なります。

trueList = (elem for elem in list if trueOrFalseFunc(elem) )
falseList = (elem for elem in list if elem not in trueList )
于 2012-04-09T21:13:58.860 に答える