我在下面这样的代码中有一个部分,其中文件名迭代地提供给循环。我希望不会有两个同名的文件被处理(以避免重复处理),所以我使用了上面的"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)发布于 2013-05-08 16:13:46
从我从代码示例和基于函数名的猜测中可以推断出,如果已经处理了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)或者,如果createdata和create_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-08 15:19:26
为什么不先构建集合,然后再处理集合中的文件呢?如果元素已经存在,则集合不会添加相同的元素;
>>> myset = { element for element in ['abc', 'def', 'ghi', 'def'] }
>>> myset
set(['abc', 'ghi', 'def'])发布于 2013-05-08 16:04:59
更多的代码可能会有所帮助。不确定是否是这种情况,但if条件与初始化位置在同一个块中
processed_set = set()因此,基本上,如果xyz != 1,则只剩下一个空集,并且不会向该集添加任何内容。如果设置的循环多次命中第一个else语句,则每次都会清除set的内容。
再说一次,我不太确定你的代码是如何流动的,因为它现在有点晦涩难懂。添加更多的周边代码,人们会更容易帮到你。
https://stackoverflow.com/questions/16434280
复制相似问题