使用set来避免重复处理

时间:2013-05-08 06:41:47

标签: python

我参与下面的代码,其中迭代地向循环提供文件名。我希望没有两个同名的文件名 得到处理(以避免重复处理)所以我使用" set"如上所述。

然而,这似乎没有按预期工作。我得到一个空的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)

3 个答案:

答案 0 :(得分: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都是函数,您不希望为同一文件名运行多次,则可以创建过滤装饰器。如果您真的关心返回值,则需要使用memoizing装饰器

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

答案 1 :(得分:0)

为什么不先构建你的设置,然后再处理集合中的文件?如果已经存在,该集合将不会添加相同的元素;

>>> myset  = { element for element in ['abc', 'def', 'ghi', 'def'] }
>>> myset
set(['abc', 'ghi', 'def'])

答案 2 :(得分:0)

您的代码可能会有所帮助。不确定是否是这种情况,但if条件与初始化

的块相同
processed_set = set()

所以基本上如果xyz!= 1那么你将留下一个空集,并且没有任何东西被添加到集合中。如果你有一个循环设置多次击中第一个else语句,你每次都要清除你的集合的内容。

同样,我不确定你的代码是如何流动的,因为它目前有点模糊。添加更多周围的代码,人们可以更轻松地帮助您。