如何在python list comprehension

时间:2016-11-11 01:53:28

标签: 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)

我收到了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)

正如你可以看到我试图减少到列表理解的问题是嵌套的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问题是在2D数组(Matrix)中找到由形状I组成的最大值,它们表示为沙漏形状。

e.g。

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。

3 个答案:

答案 0 :(得分:2)

列表推导应该用于生成列表。不鼓励使用它们来获得某种副作用。在您的变量分配的情况下,禁止。

它实际上是

的简写
result = []
for ...:
    result.append(...)

如果你的问题不符合这种模式,那就没有把业务写成列表理解。

构建多个列表推导是完美的形式;然后应用像max这样的函数将列表压缩成一个变量。

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

可以用生成器和字典理解来替换列表。

理解力鼓励您将计算分解为块或构建块,然后将它们串联起来进行更复杂的操作。

答案 1 :(得分: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)

答案 2 :(得分:1)

鉴于这是来自完成的比赛...
使用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)))