Python, следующая итерация цикла над циклом - PullRequest
12 голосов
/ 09 февраля 2010

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

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

Ответы [ 5 ]

8 голосов
/ 09 февраля 2010

Замените 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 голосов
/ 09 февраля 2010

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

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
2 голосов
/ 09 февраля 2010

Вы всегда можете преобразовать в цикл 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.

0 голосов
/ 09 февраля 2010

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

>>> 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
0 голосов
/ 09 февраля 2010

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

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...