Python 有没有一种方法可以遍历一个集合,同时添加项并对它们进行迭代?
我的第一个解决方案是这样的,但它没有像我扩展到的那样工作。我的意思是,我想向这个集合中添加一些项目,集合仍然能够遍历剩余的项目和新的项目。例如,如果我已进入e_closure_状态,最后是nums{2,3},在if语句之后将添加数字5,我希望第一个For循环也遍历{2,3}和5。提前谢谢,如果我听不懂,很抱歉Python 有没有一种方法可以遍历一个集合,同时添加项并对它们进行迭代?,python,set,nfa,Python,Set,Nfa,我的第一个解决方案是这样的,但它没有像我扩展到的那样工作。我的意思是,我想向这个集合中添加一些项目,集合仍然能够遍历剩余的项目和新的项目。例如,如果我已进入e_closure_状态,最后是nums{2,3},在if语句之后将添加数字5,我希望第一个For循环也遍历{2,3}和5。提前谢谢,如果我听不懂,很抱歉 for nextstate in e_closure_statesFinal: print(nextstate) for y in range(state,
for nextstate in e_closure_statesFinal:
print(nextstate)
for y in range(state,len(self.states)+ 1):
if ((nextstate, '@') in self.transition_function.keys()):
e_closure_statesFinal = e_closure_statesFinal|self.transition_function[(nextstate, '@')]
else :
break
第二个解决方案有效,但我想知道是否有更快的方法
i = 0
while i < len(e_closure_statesFinal):
for nextstate in e_closure_statesFinal:
for y in range(state,len(self.states)+ 1):
if ((nextstate, '@') in self.transition_function.keys()):
e_closure_statesFinal = e_closure_statesFinal |self.transition_function[(nextstate, '@')]
else :
break
i += 1
i=0
当i
你明确要求的事情无法实现;在迭代时修改set
是被禁止的(即使它有效,Python的set
的本质是新元素可能出现在已经迭代的元素之前或之后,因此它不一致,这也是被禁止的部分原因)。可以想象,您可以运行一个嵌套循环,该循环运行原始集的副本,然后运行结果集与原始集之间的差异,等等。类似于:
workingset = {...}
lastset = set()
while lastset != workingset: # Until a run doesn't change workingset
newelems = workingset - lastset
lastset = workingset.copy()
for elem in newelems: # Run over all new elements in workingset
... do stuff ...
if somecondition:
workingset.add(someelem) # Maybe add stuff to workingset
你能告诉我你的代码是否比我使用的第二个解决方案快?我更新了主要问题。提前谢谢。@M.Mar:我建议您进行测试,但您的解决方案确实有一些危险信号(特别是,它必须对self.transition_function.keys()中的if((nextstate,“@”)的每一次点击都与一个新的集合进行完全联合):
,当实际上只需要一个时,如果不用于确定何时可以安全地就地执行操作的问题,就地更新可用于其他更新)。通常,这是通过队列解决的,在队列中,您可以使用初始元素预填充队列,从队列中弹出内容,并在处理时向队列中添加更多内容。我对Python不是很精通,所以我将只向您提供关于Python中队列的链接:。使用队列将比使用外部循环完全重新处理列表更有效,正如您和ShadowRanger的回答中所述。