2016-11-11 28 views
-1

我想了解如何使用列表理解來查找矩陣內最大值之類的內容。如何在python列表理解的嵌套循環中執行變量賦值

這是我想要做的簡化版本。

max_hourglass = 0 
[[max_hourglass = i+j for j in range(4) if j < 3] for i in range(4)] 
print(max) 

我得到一個語法錯誤的最大分配。我試着將ij轉換爲整數,以防萬一這是問題,但是,似乎並不是這樣。

我試圖使用此代碼的更復雜的問題是解決HackerRank問題。我已經解決了它,但是,我只是試圖通過使用不同的技術來解決這個問題來擴展我對python3的瞭解。 This is the Hackerrank problem

這是更復雜的問題代碼,以防萬一問題不同。

arr = [] 
for _ in range(6): 
    arr.append([int(num) for num in input().split()]) 

max_hourglass = 0 
for i in range(4): 
    for j in range(4): 
     hourglass = arr[i][j] + arr[i][j+1] + arr[i][j+2] + arr[i+1][j+1] + arr[i+2][j] + arr[i+2][j+1] + arr[i+2][j+2] 
     if hourglass > max_hourglass: 
      max_hourglass = hourglass 
print(max_hourglass) 

正如你可以看到,我試圖減少到列表中理解這個問題是嵌套的循環,爲其我用這個代碼想出了相同的邏輯簡化版本:

[max_hourglass = (arr[i][j] + arr[i][j+1] + arr[i][j+2] + arr[i+1][j+1] + arr[i+2][j] + arr[i+2][j+1] + arr[i+2][j+2]) for j in range(4) if (arr[i][j] + arr[i][j+1] + arr[i][j+2] + arr[i+1][j+1] + arr[i+2][j] + arr[i+2][j+1] + arr[i+2][j+2]) > max_hourglass] for i in range(4)] 

我完全意識到這是不太可讀的代碼,我不會在生產中使用它,而只是想進一步理解python的列表理解語法。

對於上下文中,Hackerrank問題是在2D陣列(矩陣)由其中它們表示爲沙漏形狀的形狀I的值中的最大總和找到。

例如

1 1 1 0 0 0 
0 1 0 0 0 0 
1 1 1 0 0 0 
0 0 2 4 4 0 
0 0 0 2 0 0 
0 0 1 2 4 0 

將導致輸出19作爲值:

2 4 4 
    2 
1 2 4 

加起來19.

+1

按'max = ...'你是指'max(...)'? – TigerhawkT3

+2

你不能在列表理解中進行分配。只是簡單的做'[I + J ...]' –

+1

在我看來,如果你對某種競爭編寫代碼,您應該完成它自己的優點和能力,對此有關基本語法問題講卷。 – TigerhawkT3

回答

2

列表解析都應該被用來產生一個列表。不鼓勵使用它們來產生某種副作用。並且在你的變量賦值的情況下,禁止。

這實際上是對

result = [] 
for ...: 
    result.append(...) 

速記如果您的問題不屬於這種類型,它有沒有業務寫成一個列表理解。

這是非常好的形式,構建若干列表內涵;然後應用一些函數,如max將列表壓縮成一個變量。

list1 = [.... for i in list0] 
list2 = [.... for j in list1] 
mymax = max(list2) 

該列表可以用生成器和字典解釋來替換。

悟鼓勵你打破計算成塊或積木,然後將它們串在一起成更復雜的操作。

+0

謝謝,我沒有意識到變量賦值在列表理解中是被禁止的,因爲我是使用它的新手,我只是對其潛力和正確的做法有所暗示。我將努力在未來使用它只產生一個列表。 – joshuatvernon

1

這是你的列表理解

arr = [] 
for _ in range(6): 
    arr.append([int(num) for num in input().split()]) 

max_hourglass = max([arr[i][j] + arr[i][j+1] + arr[i][j+2] + arr[i+1][j+1] + arr[i+2][j] + arr[i+2][j+1] + arr[i+2][j+2] for i in range(4) for j in range(4)]) 

print(max_hourglass) 

更妙的是:

arr = [[int(num) for num in input().split()] for _ in range(6)] 

max_hourglass = max([arr[i][j] + arr[i][j+1] + arr[i][j+2] + arr[i+1][j+1] + arr[i+2][j] + arr[i+2][j+1] + arr[i+2][j+2] for i in range(4) for j in range(4)]) 

print(max_hourglass) 
+1

我可以看到這是通過使用列表理解產生沙漏值的列表以及使用'max()'函數查找沙漏值的最大值的正確方法。謝謝。 – joshuatvernon

1

鑑於這是一個完成比賽......
使用2個嵌套列表內涵,口罩和2嵌套發電機表達式:

import itertools as it 

data = [[int(x) for x in input().split()] for _ in range(6)] 
mask = [(0,0), (0, 1), (0, 2), (1, 1), (2, 0), (2, 1), (2, 2)] 
print(max(sum(data[x+dx][y+dy] for dx, dy in mask) 
      for x, y in it.product(range(6-3+1), repeat=2)))