Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 有没有一种方法可以遍历一个集合,同时添加项并对它们进行迭代?_Python_Set_Nfa - Fatal编程技术网

Python 有没有一种方法可以遍历一个集合,同时添加项并对它们进行迭代?

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,

我的第一个解决方案是这样的,但它没有像我扩展到的那样工作。我的意思是,我想向这个集合中添加一些项目,集合仍然能够遍历剩余的项目和新的项目。例如,如果我已进入e_closure_状态,最后是nums{2,3},在if语句之后将添加数字5,我希望第一个For循环也遍历{2,3}和5。提前谢谢,如果我听不懂,很抱歉

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的回答中所述。