Подтвердить что ты не робот

Python, следующая итерация цикла над циклом

Мне нужно получить следующий элемент первого цикла при определенном условии, но условие находится во внутреннем цикле. Есть ли более короткий способ сделать это, чем это? (тестовый код)

    ok = 0
    for x in range(0,10):
        if ok == 1:
            ok = 0
            continue
        for y in range(0,20): 
            if y == 5:
                ok = 1
                continue

Что в этой ситуации?

for attribute in object1.__dict__:
    object2 = self.getobject()
    if object2 is not None:
        for attribute2 in object2: 
            if attribute1 == attribute2:
                # Do something
                #Need the next item of the outer loop

Второй пример показывает лучшую мою текущую ситуацию. Я не хочу публиковать исходный код, потому что он на испанском языке. object1 и object2 - это 2 очень разных объекта, один из которых имеет объектно-реляционное отображение, а другой - webcontrol. Но 2 из их атрибутов имеют одинаковые значения в определенных ситуациях, и мне нужно перейти к следующему элементу внешнего цикла.

4b9b3361

Ответ 1

Замените continue во внутреннем цикле break. То, что вы хотите сделать, - это фактически вырваться из внутреннего цикла, так что continue делает противоположное тому, что вы хотите.

ok = 0
for x in range(0,10):
    print "x=",x
    if ok == 1:
        ok = 0
        continue
    for y in range(0,20): 
        print "y=",y
        if y == 5:
            ok = 1
            break

Ответ 2

Вы всегда можете преобразовать в цикл while:

flag = False
for x in range(0, 10):
    if x == 4: 
        flag = True
        continue

становится

x = 0
while (x != 4) and x < 10:
    x += 1
flag = x < 10

Не нужно, проще, но лучше imho.

Ответ 3

Ваш примерный код эквивалентен (что не похоже на то, что вы хотите):

for x in range(0, 10, 2):
    for y in range(20): 
        if y == 5:
           continue

Чтобы перейти к следующему элементу, не используя continue во внешнем цикле:

it = iter(range(10))
for x in it:
    for y in range(20):
        if y == 5:
           nextx = next(it)
           continue

Ответ 4

Значит, ты не за чем-то вроде этого? Я предполагаю, что вы зацикливаете ключи на словарь, а не на значения, идущие по вашему примеру.

for i in range(len(object1.__dict__)):
  attribute1 = objects1.__dict__.keys()[i]
  object2 = self.getobject() # Huh?
  if object2 is not None:
    for j in range(len(object2.__dict__)):
      if attribute1 == object2.__dict__.keys()[j]:
        try:
          nextattribute1 = object1.__dict__.keys()[i+1]
        except IndexError:
          print "Ran out of attributes in object1"
          raise

Ответ 5

Мне не совсем понятно, что вы хотите, но если вы тестируете что-то для каждого элемента, созданного во внутреннем цикле, any может быть тем, что вы хотите (docs)

>>> def f(n):  return n % 2
... 
>>> for x in range(10):
...     print 'x=', x
...     if f(x):
...         if any([y == 8 for y in range(x+2,10)]):
...             print 'yes'
... 
x= 0
x= 1
yes
x= 2
x= 3
yes
x= 4
x= 5
yes
x= 6
x= 7
x= 8
x= 9