如何添加到循环I';我正在用Python迭代

如何添加到循环I';我正在用Python迭代,python,loops,Python,Loops,我正在搜索一系列脚本,在每个脚本中,我都在解析它,除此之外,还找到了下标 每当我找到一个下标时,我都想将它添加到我正在搜索的脚本列表中 我想出了这个while循环: while keep_checking == True: TMP = deepcopy(FILE_LIST) for fname in TMP: if not fname in processed: SCL_FILE = fname break

我正在搜索一系列脚本,在每个脚本中,我都在解析它,除此之外,还找到了下标

每当我找到一个下标时,我都想将它添加到我正在搜索的脚本列表中

我想出了这个while循环:

while keep_checking == True:
    TMP = deepcopy(FILE_LIST)
    for fname in TMP:
        if not fname in processed:
            SCL_FILE = fname
            break
    handleSCL(SCL_FILE)
    processed.add(SCL_FILE)
    if processed == FILE_LIST:
        keep_checking = False
        break
上面的代码完成了任务,但我觉得
脏兮兮的。handleSCL()
正在搜索该文件并向
文件列表添加任何新的下标


有更干净的方法吗?

我会使用类似于a*寻路算法的方法(只是没有寻路部分)

  • 打开列表:尚未检查位置文件
  • 已关闭列表:已检查位置文件
首先将您的第一个文件添加到openlist;然后遍历openlist中的每个元素。对于每个元素,查找所有文件,对于每个新文件,检查其是否在任一列表中。如果两者都不在,则将其添加到openlist。完成该元素后,将其添加到closedlist

这是一种非常有效和干净的方式,可以不重复地遍历所有元素


编辑:进一步考虑后,您可以使用一个有序列表,并对其进行迭代,将新文件添加到列表的末尾。[当前开始]是关闭列表,[当前结束]是打开列表。由于排序和路径成本计算,A*需要两个列表,但您正在进行完整搜索,因此不需要该功能。然后,您只需要为单个列表添加一个“如果不存在则添加”。

您的循环需要一些清理

break
将中断while循环,无需继续检查。也不需要TMP,直接在for循环中使用它

while processed != FILE_LIST:
    for fname in deepcopy(FILE_LIST):
        if not fname in processed:
            SCL_FILE = fname
            break

    handleSCL(SCL_FILE)
    processed.add(SCL_FILE)

将用更少的代码完成同样的工作。

经过深思熟虑,我最终编写了一个快速自定义队列

class PerQueue(object):

    def __init__(self):
        self._init()
        self.all_files = set()
        self.current   = None
        self.files     = set()
        self._init     = False
        self.cur_files = set()

    def _setflag(self, value):
        self._init = value
        for item in self.all_files:
            if item.startswith('ss'):
                self.cur_files.add(item)

    def _getflag(self):
        return self._init

    def empty(self):
        n = self._empty()
        return n

    def pushMany(self, itemList):
        for item in itemList:
            self.push(item)

    def push(self, item):
        if not item in self.all_files and not item in self.files:
            self._put(item)

    def pop(self):
        # I don't want errors
        if not self.empty():
            self.current = self._get()
            self.all_files.add(self.current)
            if self.init:
                self.cur_files.add(self.current)
        else:
            self.current = None
        return self.current

    def _init(self):
        self.files = set()

    def _empty(self):
        return not self.files

    def _get(self):
        return self.files.pop()

    def _put(self, item):
        self.files.add(item)

    init = property(_getflag, _setflag)

这使我能够处理几个特殊条件(使用所有的_文件和cur_文件)以及init标志。我们在任何时候最多只能处理几百个文件,所以我不担心大小限制

这会更干净。。。在这一点上可能没有必要:

for fname in deepcopy(FILE_LIST):
     handleSCL(fname)

deepcopy
的目的是什么?
handleSCL
如何更新
文件列表
?通过全球数据?很难说出这里的一切。我认为有必要多加一点背景…哇,这太干净了!那么,这种方法是有效的还是有更好的方法?