2011-06-14 292 views
32

我正在編寫代碼以確定我的nxn列表中的每個元素是否相同。即[[0,0],[0,0]]返回true,但[[0,1],[0,0]]將返回false。我正在考慮編寫一個代碼,當它發現一個與第一個元素不相同的元素時立即停止。即:如何停止for循環

n=L[0][0] 
m=len(A) 
for i in range(m): 
for j in range(m): 
    if 
    L[i][j]==n: -continue the loop- 
    else: -stop the loop- 

我想停止這個循環,如果L[i][j]!==n並返回false。否則返回true。我將如何去實施這個?

回答

59

使用breakcontinue做到這一點。打破嵌套循環可以使用Python中的以下來完成:

for a in range(...): 
    for b in range(..): 
     if some condition: 
     # break the inner loop 
     break 
    else: 
     # will be called if the previous loop did not end with a `break` 
     continue 
    # but here we end up right after breaking the inner loop, so we can 
    # simply break the outer loop as well 
    break 

另一種方式是在一個函數來包裝的一切,用return從環逃脫。

+3

哇,希望C#有'for ... else'構造! – Blindy 2011-06-14 16:06:37

+2

哦,我希望對於C++,Java也是如此...... :-) – 2011-06-14 16:09:54

+0

我試圖讓函數在休息之前返回一個值,但我不斷收到一個警告,表示休息永遠不會到達 – LostLin 2011-06-14 16:13:12

2

試着簡單地使用break聲明。

您也可以使用下面的代碼爲例:

a = [[0,1,0], [1,0,0], [1,1,1]] 
b = [[0,0,0], [0,0,0], [0,0,0]] 

def check_matr(matr, expVal):  
    for row in matr: 
     if len(set(row)) > 1 or set(row).pop() != expVal: 
      print 'Wrong' 
      break# or return 
     else: 
      print 'ok' 
    else: 
     print 'empty' 
check_matr(a, 0) 
check_matr(b, 0) 
0

爲了跳出循環,您需要使用break語句。

n=L[0][0] 
m=len(A) 
for i in range(m): 
for j in range(m): 
    if L[i][j]!=n: 
     break; 

在這裏,您有關於休息和繼續解釋Python官方手冊和其它的流程控制語句:

http://docs.python.org/tutorial/controlflow.html

編輯:作爲一個評論者指出的那樣,這並不只是結束內循環。如果您需要終止兩個循環,則沒有「簡單」的方法(其他人已經給出了一些解決方案)。其中一個方法可行。將引發異常:

def f(L, A): 
    try: 
     n=L[0][0] 
     m=len(A) 
     for i in range(m): 
      for j in range(m): 
       if L[i][j]!=n: 
        raise RuntimeError("Not equal") 
     return True 
    except: 
     return False 
+0

你打破了循環的內在,使用分號是不必要的和醜陋的。 – utdemir 2011-06-14 16:14:28

0

其他的方式做同樣的是:

el = L[0][0] 
m=len(L) 

print L == [[el]*m]*m 

或者:

first_el = L[0][0] 
print all(el == first_el for inner_list in L for el in inner_list) 
-1

爲了達到這個目的,你可以這樣做:

n=L[0][0] 
m=len(A) 
for i in range(m): 
    for j in range(m): 
     if L[i][j]==n: 
      //do some processing 
     else: 
      break; 
37

有幾種方法可以做到這一點:

最簡單的方法:定點變量

n = L[0][0] 
m = len(A) 
found = False 
for i in range(m): 
    if found: 
     break 
    for j in range(m): 
    if L[i][j] != n: 
     found = True 
     break 

優點:易於理解 缺點:附加條件語句,每循環

哈克的方式:提出異議

n = L[0][0] 
m = len(A) 

try: 
    for x in range(3): 
    for z in range(3): 
    if L[i][j] != n: 
     raise StopIteration 
except StopIteration: 
    pass 

優點:非常簡單 缺點:使用異常的語義

的清潔方式之外:做一個功能

def is_different_value(l, elem, size): 
    for x in range(size): 
    for z in range(size): 
    if l[i][j] != elem: 
     return True 
    return False 

if is_different_value(L, L[0][0], len(A)): 
    print "Doh" 

優點:更清潔,仍然有效 缺點:但感覺像C

的Python的方式:使用迭代,因爲它應該是

def is_different_value(iterable): 
    first = iterable[0][0] 
    for l in iterable: 
    for elem in l: 
     if elem != first: 
      return True 
    return False 

if is_different_value(L): 
    print "Doh" 

個優點:還算乾淨,高效的 缺點:你reinvdent輪

的大師方式:使用any()

def is_different_value(iterable): 
    first = iterable[0][0] 
    return any(any((cell != first for cell in col)) for elem in iterable)): 

if is_different_value(L): 
    print "Doh" 

優點:人們會讀你:你會覺得與黑暗的力量 利弊授權代碼可能會開始不喜歡你

+1

+1爲guru的方式(沒有好,無論如何偉大的答案,但真正喜歡古魯的方式的利弊) – JMax 2014-08-26 08:40:08