2

反復するのに非常にコストがかかるデータ構造があり、特定の基準に応じてその要素をリストに収集する必要があるとしましょう。

#fake data.  pretend it's hard to access
import random
slowStruct = range(30)
random.shuffle(slowStruct)

def check1(x):
    return x < 3

def check2(x):
    return x > 15

def check3(x):
    return x < 25 and x > 20

最も簡単な方法は、リスト内包表記を使用することです。ただし、これには構造全体で 3 回の反復が必要です。

res1 = [node for node in slowStruct if check1(node)]
res2 = [node for node in slowStruct if check2(node)]
res3 = [node for node in slowStruct if check3(node)]

より高速な方法は、ループを使用して結果リストに追加することです。

res1 = []
res2 = []
res3 = []
for node in slowStruct:
    if check1(node):
        res1.append(node)
    if check2(node):
        res2.append(node)
    if check3(node):
        res3.append(node)

単一の反復のみを使用しながら、複数のフィルターを実行できる関数型プログラミング構造またはイディオムはありますか?

次のようになると想像できます。

res1, res2, res3 = multiFilter(preds=[check1, check2, check3], iterable=slowStruct)
4

2 に答える 2

2

内包でそうするためのきれいな方法はありません。ループが必要な場合は、ループを使用します。リスト内包表記は、1 つのリストのみを作成する必要があります。

ループを使用する場合は、カプセル化することができます。

def multi_filter(predicates, iterable):
    bins = [[] for _ in predicates]
    for item in iterable:
        for predicate, bin in zip(predicates, bins):
            if predicate(item):
                bin.append(item)

    return bins
于 2013-09-27T20:11:41.907 に答える