2017-01-26 92 views
0

我正在研究Euler Project,問題11,它涉及在網格中查找四個相鄰數字的所有可能組合的最大產品。對於其他基本方向Python使用列表理解通過嵌套列表進行迭代

if x+4 <= len(matrix[x]): #check right 
    my_slice = [int(matrix[x][n]) for n in range(y,y+4)] 

...等等:我已經分裂成數嵌套列表,並使用了列表解析切片的相關數字,像這樣。到現在爲止還挺好。但是當我到對角線時,事情就會變得有問題。我試圖用兩個範圍是這樣的:

if x+4 <= len(matrix[x]) and y-4 >=0:# check up, right 
    my_slice = [int(matrix[m][n]) for m,n in ((range(x,x+4)),range(y,y+4))] 

但是,這會產生以下錯誤:

<ipython-input-53-e7c3ebf29401> in <listcomp>(.0) 
48  if x+4 <= len(matrix[x]) and y-4 >=0:# check up, right 
---> 49   my_slice = [int(matrix[m][n]) for m,n in ((range(x,x+4)),range(y,y+4))] 
ValueError: too many values to unpack (expected 2) 

我對X期望指標的[0,0] y值將是['0,0','1,1','2,2','3,3']。使用枚舉函數遍歷列表似乎並沒有什麼不同,但顯然我錯過了一些東西。

P.S.我爲可怕的變量術語表道歉,我正在進行一項工作。

+1

嘗試壓縮範圍? – JETM

+0

你正在處理*數組*還是*列表*?它們不是同一件事。 –

+0

謝謝您的澄清,實際上它是一個嵌套列表。編輯來反映。 – SgtStens

回答

0

你並不需要使用兩個範圍,只需使用一個,並將其應用兩次:

my_slice = [int(matrix[m][m-x+y]) for m in range(x,x+4)] 

由於您的n應該是連接range(y,y+4)我們知道,總是會有的差異y-xmn之間。因此,我們不用兩個變量,而是可以自己抵消差異。

或者如果你仍然想使用二range(..)結構,你可以使用zip(..)這需要生成的列表,消耗他們同時併發出元組:

my_slice = [int(matrix[m][n]) for m,n in zip(range(x,x+4),range(y,y+4))] 

但我認爲這不會提高性能,因爲的元組打包和開箱開銷。

+0

/facepalm沒有意識到x和y範圍始終是相同的。我並不太擔心表演,因爲這只是爲了學習目的。謝謝,接受! – SgtStens

0

[int(matrix[x+d][n+d]) for d in range(4)]對於一個對角線。
[int(matrix[x+d][n-d]) for d in range(4)]其他。

順便說一句,更好地使用標準矩陣索引名稱,即行i和列j。不是xy。這很混亂。我認爲你甚至會迷惑自己,例如你的if x+4 <= len(matrix[x])測試x與第二維長度相反,但在第一維中使用它。咦?

+0

這不會是我第一次迷惑自己,謝謝你的建設性批評。我爲變量/索引命名而努力。 – SgtStens