如何在Python中添加循环

2024-09-30 00:26:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我在一个脚本列表中搜索,在每个脚本中,我都在解析它,并且在其他事情中,找到下标。你知道吗

每当我找到一个下标,我就想把它添加到我正在搜索的脚本列表中。你知道吗

我想出了这个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

上面的代码完成了这项工作,但我觉得dirty. handleSCL()正在搜索文件并向FILE_LIST添加任何新的下标。你知道吗

有没有更干净的方法?你知道吗


Tags: in脚本列表iffnametmplistfile
3条回答

你的循环需要清理!你知道吗

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标志。我们在任何时候最多只能处理几百个文件,所以我不担心大小限制。你知道吗

我将使用类似于a*寻路算法的方法(只是没有寻路部分)。你知道吗

  • 打开列表:放置尚未检查的文件。你知道吗
  • 关闭列表:放置已检查的文件。你知道吗

首先将第一个文件添加到openlist;然后遍历openlist中的每个元素。对于每个元素,查找所有文件,对于每个新文件,检查它是否在任一列表中。如果两者都不在,则将其添加到openlist。完成元素后,将其添加到closedlist。你知道吗

这是一种非常有效和干净的方法,可以不重复地遍历所有元素。你知道吗

编辑:在进一步考虑之后,您可以使用一个有序的列表,并遍历它,将新文件添加到列表的末尾。[当前开始]是关闭列表,[当前结束]是打开列表。由于排序和路径开销的计算,A*需要两个列表,但您正在执行完全搜索,因此不需要该功能。然后您只需要为单个列表添加一个“addif not exist”。你知道吗

相关问题 更多 >

    热门问题