1

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

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

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

有更清洁的方法吗?

4

4 回答 4

1

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

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

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

这是一种非常有效且干净的方式,可以在不重复的情况下遍历所有元素。

编辑:经过进一步考虑,您可以使用一个有序列表,并遍历它,将新文件添加到列表末尾。[beginning-current] 是封闭列表,[current-end] 是开放列表。由于排序和路径成本计算,A* 需要两个列表,但您正在执行完整搜索,因此您不需要该功能。然后,您只需要为单个列表添加一个“如果不存在则添加”。

于 2012-09-13T18:35:05.490 回答
1

你的循环需要一些清理!

break将跳出while循环,不需要keep_checking。也不需要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)

将以更少的代码完成相同的工作。

于 2012-09-13T18:41:54.820 回答
0

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

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)

这使我能够处理几个特殊条件(使用 all_files 和 cur_files)以及 init 标志。最多我们有几百个文件随时处理,所以我不担心大小限制。

于 2012-11-12T18:33:20.833 回答
0

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

for fname in deepcopy(FILE_LIST):
     handleSCL(fname)
于 2016-04-26T07:55:54.543 回答