有没有办法通过一个集合,同时添加项目并迭代它们?
Is there a way to go through a set and on the same time adding items and iterate them also?
我的第一个解决方案是这个,但它没有按照我预期的方式工作。我的意思是我想向这个集合中添加一些项目,并且该集合仍然能够遍历剩余的项目以及新的 item/s。例如,如果我进入 e_closure_statesFinal 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
您的具体要求无法完成;在迭代时修改 set
是被禁止的(即使它有效,Python 的 set
的性质是新元素可以出现在已经迭代的元素之前或之后,所以它不会一致,这就是为什么禁止这样做的部分原因)。你可以想象 运行 一个嵌套循环 运行 在原始 set
的副本上,然后 运行 在结果 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
我的第一个解决方案是这个,但它没有按照我预期的方式工作。我的意思是我想向这个集合中添加一些项目,并且该集合仍然能够遍历剩余的项目以及新的 item/s。例如,如果我进入 e_closure_statesFinal 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
您的具体要求无法完成;在迭代时修改 set
是被禁止的(即使它有效,Python 的 set
的性质是新元素可以出现在已经迭代的元素之前或之后,所以它不会一致,这就是为什么禁止这样做的部分原因)。你可以想象 运行 一个嵌套循环 运行 在原始 set
的副本上,然后 运行 在结果 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