首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用set避免重复处理

使用set避免重复处理
EN

Stack Overflow用户
提问于 2013-05-08 14:41:47
回答 3查看 120关注 0票数 0

我在下面这样的代码中有一个部分,其中文件名迭代地提供给循环。我希望不会有两个同名的文件被处理(以避免重复处理),所以我使用了上面的"set“方法。

然而,这似乎并没有像预期的那样工作。我得到一个空的processed_set,逻辑没有按预期执行。

代码语言:javascript
运行
复制
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)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-05-08 16:13:46

从我从代码示例和基于函数名的猜测中可以推断出,如果已经处理了filename,那么您要做的就是避免运行代码。你可以这样做:

代码语言:javascript
运行
复制
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都是您不希望对同一文件名多次运行的函数,则可以创建一个过滤装饰器。如果你真正关心返回值,你会想要使用一个记忆装饰器

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 2013-05-08 15:19:26

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

代码语言:javascript
运行
复制
>>> myset  = { element for element in ['abc', 'def', 'ghi', 'def'] }
>>> myset
set(['abc', 'ghi', 'def'])
票数 0
EN

Stack Overflow用户

发布于 2013-05-08 16:04:59

更多的代码可能会有所帮助。不确定是否是这种情况,但if条件与初始化位置在同一个块中

代码语言:javascript
运行
复制
processed_set = set()

因此,基本上,如果xyz != 1,则只剩下一个空集,并且不会向该集添加任何内容。如果设置的循环多次命中第一个else语句,则每次都会清除set的内容。

再说一次,我不太确定你的代码是如何流动的,因为它现在有点晦涩难懂。添加更多的周边代码,人们会更容易帮到你。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16434280

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档