Разъяснение синтаксиса max () в python - PullRequest
1 голос
/ 22 февраля 2012

Это относится к проблеме, опубликованной в: 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-мерная матрица, эквивалентная матрице 20х20, приведенной в задаче.Мое понимание функции 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 ]

2 голосов
/ 22 февраля 2012

После вашего разъяснения - на самом деле, это не так, если вы выглядите лучше, у вас есть это:

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

ie:

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

, что является списком, таким как тот, который вы дали в качестве примера ([x for x in line.split()] ).

См. документацию:

Выдержка:

макс. (Итерируемый [, аргументы ...] [ключ])

с итерацией с одним аргументом,вернуть самый большой элемент непустой итерации (такой как строка, кортеж или список).С более чем одним аргументом верните самый большой из аргументов.

Вы можете сделать, например, так:

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

Надеюсь, это поможет.

0 голосов
/ 22 февраля 2012
>> 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)

Не совсем уверен, что вы хотите. Но вы получили максимальное значение из созданного списка.

...