2010-02-09 185 views
11

我需要在給定條件下獲得第一個循環的下一個項目,但條件是在內部循環中。有沒有比這更簡單的方法呢? (測試代碼)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是兩個非常不同的對象,一個是對象關係映射性質,另一個是web控件。但是在某些情況下,它們的屬性有2個相同的值,我需要跳轉到外部循環的下一個項目。

+0

看起來像'NameError' – 2010-02-09 16:53:34

回答

7

將內循環中的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 
+0

是真的,我的錯。但我仍然需要看看能否以更簡單的方式獲得外部循環的下一個項目:) – Pablo 2010-02-09 15:50:58

+0

@Pablo:立即返回外部循環與拆除內部循環相同,不是嗎?還是你的意思是別的? – MAK 2010-02-09 16:08:48

+0

@Pablo:我想你想避免使用'break'。我不認爲有任何其他方式可以從'for'循環返回外部循環。想到的唯一方法是使用while循環,循環條件檢查標誌的真實性。這實際上就是ron所建議的,你可以使用顯式的'iterator'輕鬆地在像''''循環這樣的迭代器上運行while循環。 – MAK 2010-02-09 16:24:31

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 

沒必要簡單,但更好恕我直言。

+0

謝謝,但我發佈了一個不好的例子。在我目前的情況下,我正在使用對象而不是數字。 – Pablo 2010-02-09 16:14:43

2

你的示例代碼等同於(即似乎沒有你想要的):

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 
0

所以你不是在這樣的事情之後?我假設你正在通過字典的鍵循環,而不是按照你的例子的值。

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 
0

這並不完全清楚,我自己想要的,但如果你正在測試的東西在內部循環生產的每一個項目,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