澄清python中的max()语法

时间:2012-02-22 03:21:51

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

网格只是一个2维的矩阵,相当于问题中给出的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()

2 个答案:

答案 0 :(得分:2)

在你澄清之后 - 实际上,如果你看起来更好,他们就不会这样:

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

     

使用单个参数iterable,返回非空迭代的最大项(例如字符串,元组或列表)。如果有多个参数,则返回最大的参数。

你可以做到,例如这样:

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

希望这有帮助。

答案 1 :(得分:0)

>> help(max)
max(...)
    max(iterable[, key=func]) -> value
    max(a, b, c, ...[, key=func]) -> value

    With a single iterable argument, return its largest item.
    With two or more arguments, return the largest argument.

max确实返回最大值。如果您想要位置,请执行以下操作:

a =  [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))
max_value = max(a)
max_value_position = a.index(max_value)

不完全确定你想要什么。但是你确实获得了创建列表的最大值。