0

これを行うためのよりpythonicまたは代替の方法があるかどうか疑問に思っていました。累積関数の結果を比較したい。各関数は前の出力を変更します。各関数の後で、その効果を確認したいと思います。メイン関数を実行した後に実際の結果を得るには、何かを計算する最後の関数が 1 つ必要であることに注意してください。コードでは、次のようになります (疑似コードのようなものです)。

for textfile in path:
    data = doStuff1(textfile)
calculateandPrint()

for textfile in path:
    data = doStuff1(textfile)
    data = doStuff2(data )
calculateandPrint()

for textfile in path:
    data = doStuff1(textfile)
    data = doStuff2(data )
    data = doStuff3(data )
calculateandPrint()

ご覧のとおり、n関数には1/2(n(n+1))手動でループを作成する必要があります。私が言ったように、コードをクリーンアップし、より多くの関数を追加したときにコードをより短く、管理しやすくする、よりPython的なもの(たとえば、関数のリスト?)はありますか?

実際のコード。documentsはカスタム オブジェクトです。

for doc in documents:
    doc.list_strippedtext = prepareData(doc.text)
bow = createBOW(documents)  

for doc in documents:
    doc.list_strippedtext = prepareData(doc.text)
    doc.list_strippedtext = preprocess(doc.list_strippedtext)
bow = createBOW(documents)  

for doc in documents:
    doc.list_strippedtext = prepareData(doc.text)
    doc.list_strippedtext = preprocess(doc.list_strippedtext)
    doc.list_strippedtext = abbreviations(doc.list_strippedtext)
bow = createBOW(documents)

これはほんの一部ですが、さらに機能を追加する必要があります。

4

1 に答える 1

3

で適用されるチェーンのセットを定義できますfunctools.reduce()

from functools import reduce

chains = (
    (doStuff1,),
    (doStuff1, doStuff2),
    (doStuff1, doStuff2, doStuff3),
)

for textfile in path:
    for chain in chains:
        data = reduce(lambda data, func: func(data), chain, textfile)
        calculateandPrint(data)

3つの関数が含まれている場合、呼び出しreduce()は効果的に行われます。func3(func2(func1(textfile))chain

ここでは、一連の関数が適用された後、パス内のテキストファイルcalculateandPrint() ごとに適用することを想定しています。

ループの各反復は、元の例ではループ本体for chain in chainsの 1 つを表しますが、ループは 1回だけです。doStuffxfor textfile in path

ループを交換することもできます。あなたの例に合わせて:

for chain in chains:
    for doc in documents:
        doc.list_strippedtext = reduce(lambda data, func: func(data), chain, doc.text)
    bow = createBOW(documents)  
于 2013-04-06T08:08:33.017 に答える