0

以下のようなコードに、ファイル名が繰り返しループに提供される部分があります。同じ名前の2つのファイル名が処理されないようにしたいので(重複処理を避けるため)、上記の「設定」のアプローチを使用しました。

ただし、これは期待どおりに機能しないようです。空のprocessed_setを取得し、ロジックが期待どおりに実行されません。

else:
    create_folder(filename)
    processed_set=set()

    if xyz ==1:
        if filename not in processed_set:
          createdata(name)
          processed_set.add(filename)
        else:
          avoid_double_process(name)
4

3 に答える 3

1

コード サンプルから推測し、関数名に基づいて推測できることから、filename既に処理されている場合はコードを実行しないようにする必要があります。次のようにします。

processed_set = set() #initialize set outside of loop
for filename in filenames: #loop over some collection of filenames
    if filename not in processed_set: #check for non-membership
        processed_set.add(filename) #add to set since filename wasn't in the set
        create_folder(filename) #repositioned based on implied semantics of the name
        createdata(filename)

または、createdatacreate_folderが両方とも同じファイル名に対して複数回実行したくない関数である場合は、フィルタリング デコレータを作成できます。実際に戻り値を気にする場合は、メモ化デコレータを使用することをお勧めします

def run_once(f):
    f.processed = set()
    def wrapper(filename):
        if filename not in f.processed:
        f.processed.add(filename)
        f(filename)
    return wrapper

次に、@run_once一度だけ実行する関数の関数定義の前の行に含めます。

于 2013-05-08T08:13:45.617 に答える
0

最初にセットをビルドしてから、セット内のファイルを後で処理してみませんか? すでに存在する場合、セットは同じ要素を追加しません。

>>> myset  = { element for element in ['abc', 'def', 'ghi', 'def'] }
>>> myset
set(['abc', 'ghi', 'def'])
于 2013-05-08T07:19:26.040 に答える
0

もう少しコードが役立つ場合があります。これが当てはまるかどうかはわかりませんが、 if 条件は初期化する場所と同じブロックにあります

processed_set = set()

したがって、基本的に xyz != 1 の場合、空のセットが残り、セットには何も追加されません。最初のelseステートメントに複数回ヒットするループが設定されている場合、毎回セットの内容をクリアしています。

繰り返しますが、現時点では少しあいまいであるため、コードがどのように流れるかはよくわかりません。周囲のコードをさらに追加すると、人々があなたを助けやすくなります.

于 2013-05-08T08:04:58.830 に答える