Есть ли способ пройти через набор и в то же время добавить элементы и повторить их тоже? - PullRequest
0 голосов
/ 01 ноября 2019

Моим первым решением было это, но оно не сработало так, как я это делал. Под этим я подразумеваю, что я хотел добавить некоторый элемент в этот набор, и набор все еще мог бы перебирать оставшиеся элементы, а также новые элементы. Например, если у меня есть в e_closure_statesFinal числа {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

1 Ответ

0 голосов
/ 01 ноября 2019

То, что вы конкретно просите, не может быть сделано;изменение 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
...