2016-11-11 31 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)))