2017-06-13 29 views
1

我剛開始用小腳本學習python。如果第一行與第一列相同,我碰到一個測驗以確定列表是對稱的, 第二行與第二列相同,依此類推。如果python中的塊沒有用True語句執行

def symmetric(block): 
    n = len(block) 
    i = 0 
    for i in range(n-1): 
     j = 0 
     for j in range(n-1): 
      if (block[i][j] != block[j][i]): 
       return False 
      j +=1 
     i +=1 
    return True 

所以

print symmetric([["cat", "dog", "fish"], 
       ["dog", "dog", "dog"], 
       ["fish","fish","cat"]]) 

的結果應該是假的。

但是,這段代碼總是返回True,而在調試器中,我可以看到block[i][j] != block[j][i]返回True,但if塊沒有執行。比較有沒有什麼問題,或者如果塊的構成不正確?

+2

請修復您的縮進。嚴重縮減的Python代碼是無稽之談。 – khelwood

+0

第三行'i = 0'沒有意義!第五行也一樣。 – phynfo

回答

5

它失敗的主要原因是因爲您應該編寫range(n)而不是range(n-1)(上限爲獨佔)。像:

def symmetric(block): 
    n = len(block) 
    for i in range(n): 
     for j in range(n): 
      if block[i][j] != block[j][i]: 
       return False 
    return True

不過,也有一些奇怪的事情有關這一功能:

  • 初始化i = 0j = 0。這是沒有必要的:在Python中,for循環將爲您聲明變量;
  • 您在ij上執行增量/減量,這也不是必需的。 A for循環枚舉iterable/generator並將每個值分配給ij;
  • 通常不會爲if語句寫括號。

而且你其實可以使此代碼更優雅採用雙內膽與all(..)內置函數:

def symmetric(block): 
    n = len(block) 
    return all(block[i][j] == block[j][i] for i in range(n) for j in range(n))

這是一個比較聲明明確代碼的編寫風格。由於這裏的代碼幾乎是自我解釋:「回報是否range(n)range(n)所有block[i][j] == block[j][i]ij

最後喜歡@Błotosmętek說,在他們的評論,你不必檢查block[2][0] == block[0][2]如果你已經檢查block[0][2] == block[2][0]。所以,你可以通過寫作提高性能(大約一半):

def symmetric(block): 
    n = len(block) 
    return all(block[i][j] == block[j][i] for i in range(n) for j in range(i))
+1

非常感謝!但我不明白上限是否在範圍()內是排他性的,爲什麼不拋出錯誤? buildin功能非常優雅。不能相信代碼可以如此簡潔...... – missmissyou

+0

@missmissyou:如果你寫'range(3)',它會發出'0','1'和'2'。所以'3'不包括**在輸出中。由於「矩陣」的長度爲3,因此您將覆蓋所有有效索引0,1和2.這就是爲什麼該邊界是排他性的。 –

+0

一個小小的改進 - 通過一個三角形矩陣就足夠了,因爲對角線上的元素總是等於它們自己:'爲範圍內的我返回所有(block [i] [j] == block [j] [i] (1,n)對於範圍(i-1)中的j)' –

1

你應該使用range(n)而非range(n-1);由range生成的序列不包含上限。

+0

謝謝你的回答。更改爲範圍(n-1)可以修復,但是在調試器中,我可以看到block [0] [2]和block [2] [0]到達... – missmissyou

1
def symmetric(block): 
    n = len(block) 
    for i in range(n): 
     for j in range(n): 
      print i, j 
      if (block[i][j] != block[j][i]): 
       return False 
    return True 

print symmetric([["cat", "dog", "fish"], 
       ["dog", "dog", "dog"], 
       ["fish","fish","cat"]]) 

在Python中你沒有申報或增加用於循環,蟒蛇「for循環」的變量是足夠的智能來爲我們做。

你還必須學習範圍功能蟒蛇是如何工作的,範圍()可以稱得上是三種方式,

範圍(次循環N-數):範圍將返回N個整數的列表從0開始到N-1。 (S開始位置,N結束位置):在這種情況下,範圍將返回從S開始到N-1的(N-S)個整數列表。

範圍(S-開始位置,N-末端位置,K-步驟):這裏的範圍將返回(NS)的列表/ K的整數開始從S到N-1與K.

的間隔

在你的情況下,當你說range(n-1)你的循環只在索引0,1跳過索引2時迭代,難怪你每次都變成True。