【问题标题】:How to perform variable assignment within nested loops in python list comprehension [duplicate]如何在python列表理解的嵌套循环中执行变量赋值[重复]
【发布时间】:2016-11-11 01:53:28
【问题描述】:

我想学习如何使用列表推导来查找矩阵中的最大值之类的东西。

这是我想做的简化版。

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 问题是在二维数组(矩阵)中找到由形状 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。

【问题讨论】:

  • max = ... 是指max(...)
  • 你不能在列表理解中做作业。简单做[i+j...]
  • 在我看来,如果你正在为某种竞赛编写代码,你应该根据自己的优点和能力来完成它,关于这一点,关于基本语法的问题很重要。
  • @AllDani.com - 不,不是。
  • max = 1 print max(2,3) 抛出错误。这意味着如果将max 编码为变量,则下一个开发人员在尝试使用内置函数时会出错。如果我错了,请纠正我。

标签: python list matrix max list-comprehension


【解决方案1】:

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

它实际上是一种简写

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

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

构造多个列表推导式是一种非常好的形式;然后应用max 之类的函数将列表压缩为一个变量。

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

列表可以用生成器和字典推导替换。

理解力鼓励您将计算分解为块或构建块,然后将它们串在一起形成更复杂的操作。

【讨论】:

  • 谢谢,我没有意识到变量赋值在列表理解中是被禁止的,因为我是新手,所以我只知道它的潜在和正确做法。以后我会尽量用它来生成一个列表。
【解决方案2】:

这是你的列表理解

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)

【讨论】:

  • 我可以通过使用列表推导生成沙漏值列表并使用max() 函数查找沙漏值的最大值来了解这是如何正确的方法。谢谢。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-25
    • 1970-01-01
    • 2014-11-18
    • 2014-05-06
    • 2013-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多