Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python列表理解中的嵌套循环中执行变量赋值_Python_List_Matrix_Max_List Comprehension - Fatal编程技术网

如何在python列表理解中的嵌套循环中执行变量赋值

如何在python列表理解中的嵌套循环中执行变量赋值,python,list,matrix,max,list-comprehension,Python,List,Matrix,Max,List Comprehension,我想学习如何使用列表理解来找到矩阵中的最大值之类的东西 这是我想做的一个简化版本 max_hourglass = 0 [[max_hourglass = i+j for j in range(4) if j < 3] for i in range(4)] print(max) 正如您所看到的,我试图简化为列表理解的问题是嵌套for循环,我为其提供了与简化版本相同的逻辑代码: [max_hourglass = (arr[i][j] + arr[i][j+1] + arr[i][j+2] +

我想学习如何使用列表理解来找到矩阵中的最大值之类的东西

这是我想做的一个简化版本

max_hourglass = 0
[[max_hourglass = i+j for j in range(4) if j < 3] for i in range(4)]
print(max)
正如您所看到的,我试图简化为列表理解的问题是嵌套for循环,我为其提供了与简化版本相同的逻辑代码:

[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问题是在二维数组(矩阵)中找到由形状
I
组成的值的最大总和,其中它们表示为沙漏形状

e、 g

将导致输出
19
为以下值:

2 4 4
  2  
1 2 4

总共19个。

列表理解应该用于生成列表。不鼓励将它们用于某种副作用。在变量赋值的情况下,禁止使用

这实际上是一个缩写

result = []
for ...:
    result.append(...)
如果你的问题不符合这个模式,那就没有必要把它写成一个列表

构建多个列表理解是非常好的形式;然后应用一些函数,如
max
,将列表压缩为一个变量

list1 = [.... for i in list0]
list2 = [.... for j in list1]
mymax = max(list2)
列表可以用生成器和字典理解替换


理解鼓励你将计算分解成块或构建块,然后将这些块或构建块串成更复杂的操作。

以下是你的理解列表

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)

鉴于这是一场已完成的比赛…
使用两个嵌套列表理解、一个掩码和两个嵌套生成器表达式:

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)))

你说的
max=…
是指
max(…)
?你不能在列表理解中做作业。简单地做
[i+j..]
在我看来,如果你在为某种竞争编写代码,你应该根据自己的优点和能力来完成它,关于基本语法的问题说明了很多。@AllDani.com-不,不是。
max=1 print max(2,3)
抛出了一个错误。这意味着,如果一个程序员将
max
编码为变量,那么下一个开发人员在尝试使用内置函数时将出现错误。如果我错了,请纠正我。谢谢,我不知道变量赋值在列表理解中是被禁止的,因为我对使用它还不熟悉,所以我对它的潜力和正确的实践只有一点了解。我将努力在将来只使用它来生成一个列表。我可以看出,通过使用列表理解来生成沙漏值列表,并使用
max()
函数来查找沙漏值的最大值,这是一种正确的方法。非常感谢。
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)
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)))