python - python 中 max() 语法的澄清

标签 python loops max

这是引用以下位置发布的问题: http://projecteuler.net/problem=11

我遇到了使用 python 的过于简单的解决方案,如下所示:(mayoff)

grid = [[0]*23]*3 + [[int(x) for x in line.split()]+[0,0,0] for line in
'''08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08
49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00
81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65
52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91
22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80
24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50
32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70
67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21
24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72
21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95
78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92
16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57
86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58
19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40
04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66
88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69
04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36
20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16
20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54
01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48'''.split('\n')
] + [[0]*23]*3

import operator

print max([reduce(operator.mul, [grid[y+n*d[0]][x+n*d[1]] for n in (0,1,2,3)])
        for x in xrange(0,20) for y in xrange(3,23)
        for d in ((0,1),(1,0),(1,1),(-1,1))])

网格只是一个二维矩阵,相当于问题中给出的 20x20 矩阵。 我对 max() 函数的理解是,它接受一个整数列表作为输入,然后从中选择最大值并返回它。

问题是,为什么最后一个表达式中后续的 for 循环位于 max() 的参数列表之外?这听起来让我很困惑,因为要使用 for 循环创建列表,我们可以使用以下命令来完成:

>>> line = "12 12 12 12 12 12"
>>> [x for x in line.split()]
['12','12','12','12','12','12']

执行下面类似的操作会导致错误

>>> [x] for x in line.split()

最佳答案

在你澄清之后 - 事实上,他们不是,如果你看起来更好,你有这个:

print max(
      [
        reduce(
          operator.mul, 
          [grid[y+n*d[0]][x+n*d[1]] for n in (0,1,2,3)])
        for x in xrange(0,20) 
        for y in xrange(3,23)
        for d in ((0,1),(1,0),(1,1),(-1,1))
      ])

为了减少困惑,您所拥有的是:

print max(
      [
        reduce(...)
        for x in ...
        for y in ...
        for d in ...
      ])

即:

print max([reduce(...) for x in ... for y in ... for d in ...])

这是一个列表理解,例如您作为示例给出的列表理解([x for x in line.split()] )。

查看文档:

摘录:

max(iterable[, args...][key])

With a single argument iterable, return the largest item of a non-empty iterable (such as a string, tuple or list). With more than one argument, return the largest of the arguments.

你可以这样做这个:

>>> max(1, 2, 3)
3

即使用多个参数运行 max ,它会给你其中的最大值,或者例如你可以这样做:

>>> max([1,2,3])
3

它会将其视为可迭代对象,并为您提供可迭代对象中的最大值。字符串是可迭代的,所以你也可以这样做:

>>> max("aqrmn")
'r'

或者这个:

>>> max(dict(the=1,biggest=-1,word=2,maybe=4,this=0))
'word'

它考虑字典的键,也许更容易理解,如下所示:

>>> max({1:"hey", 5:"man", -3:"how", 7:"are", 3: "you?"})
7

希望这有帮助。

关于python - python 中 max() 语法的澄清,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9388656/

相关文章:

java - 如何打破java中的if循环

mysql - 嵌套循环而不同

c# - 如何在 Entity Framework 中获取数字字符串列的最大值

python - 应用程序在 Mercurial 存储库中访问自己的版本

python - Tensorflow:使用预训练的初始模型

r - 如何使用for循环将所有股票价格乘以各自的单位数后求和?

java - 具有昂贵的自定义键功能的列表的最大值

python - 如何找到小于 x 的最大整数?

python - 如何在Python中获取以下格式的日期: "2017-06-06T07:00:00.000Z"?

java - 从堆支持的最小优先级队列获取最大值的时间复杂度