我参与下面的代码,其中迭代地向循环提供文件名。我希望没有两个同名的文件名 得到处理(以避免重复处理)所以我使用" 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)
答案 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)
或者,如果createdata
和create_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语句,你每次都要清除你的集合的内容。
同样,我不确定你的代码是如何流动的,因为它目前有点模糊。添加更多周围的代码,人们可以更轻松地帮助您。