如何添加到循环I';我正在用Python迭代
我正在搜索一系列脚本,在每个脚本中,我都在解析它,除此之外,还找到了下标 每当我找到一个下标时,我都想将它添加到我正在搜索的脚本列表中 我想出了这个while循环:如何添加到循环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 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
如何更新文件列表
?通过全球数据?很难说出这里的一切。我认为有必要多加一点背景…哇,这太干净了!那么,这种方法是有效的还是有更好的方法?