0

我在下面的代码中有一部分,其中文件名被迭代地提供给循环。我希望不应该处理两个具有相同名称的文件名(以避免重复处理),所以我使用了上述“设置”的方法。

然而,这似乎没有按预期工作。我得到一个空的处理集,逻辑没有按预期执行。

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 回答