Могу ли я определить значение в словаре напрямую, используя цикл for внутри самого словаря? - PullRequest
0 голосов
/ 20 февраля 2019

Я работаю над некоторыми проблемами Project Euler и у меня есть решение, которое я хотел бы сделать более адаптируемым.Сама проблема здесь не важна, но для тех из вас, кто интересуется, это проблема 11.

В настоящее время у меня есть сетка целых значений 20 на 20, и я нахожу максимальный продукт из 4 смежныхценности.Все работает отлично и довольно быстро.В настоящее время у меня есть следующее:

maxi = 0
amount = 4
for i in range (0,len(grid) - amount):
    for j in range (0,len(grid) - amount):
        try:
            max_dic = {
            'right':grid[i][j]*grid[i][j+1]*grid[i][j+2]*grid[i][j+3],
            'down':grid[i][j]*grid[i+1][j]*grid[i+2][j]*grid[i+3][j],
            'down_right':grid[i][j]*grid[i+1][j+1]*grid[i+2][j+2]*grid[i+3][j+3],
            'down_left':grid[i][j]*grid[i+1][j-1]*grid[i+2][j-2]*grid[i+3][j-3]
            }
        except IndexError:
            pass
        max_key = str(max(max_dic.items(), key=operator.itemgetter(1))[0])
        if max_dic[max_key] > maxi:
            maxi = max_dic[max_key]

Что я хотел бы сделать, это заменить значения в словаре на что-то, что я могу изменить (так что-то с точки зрения количества), и я подумал об использовании дляцикл в диапазоне от 0 до количества -1, который будет выглядеть следующим образом:

'right': for a in range(amount): # Multiply the correct values

Однако я не уверен, возможно ли это, и если да, то как его реализовать.

Какой-нибудь совет, как я мог бы сделать это?

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

В вашей текущей реализации вы не получите результат max_dic вообще, когда какая-либо часть превысит границы сетки.Часто в таких проблемах вы действительно хотите получить частичный результат.Если это так, вы, вероятно, хотите иметь возможность обрабатывать IndexError более детально.Например, вы можете создать простую вспомогательную функцию, которая принимает сетку и два индекса и возвращает либо значение, либо некоторое значение по умолчанию (a 1 в случае умножения).

def get_val(grid, i, j, default = 1):
    try:
        return grid[i][j]
    except IndexError:
        return default

Как только вы это получитестроительный блок, нужно просто подготовить несколько списков индексов и затем использовать несколько функций из стандартной библиотеки:

from operator import mul
from functools import reduce

# Inside your two loops over i and j ...

ms = list(range(i, i + amount))
ns = list(range(j, j + amount))
rns = list(range(j, j - amount, -1))

max_dic = {
    'right'      : reduce(mul, [get_val(grid, i, n) for n in ns]),
    'down'       : reduce(mul, [get_val(grid, m, j) for m in ns]),
    'down_right' : reduce(mul, [get_val(grid, m, n) for m, n in zip(ms, ns)]),
    'down_left'  : reduce(mul, [get_val(grid, m, n) for m, n in zip(ms, rns)]),
}
0 голосов
/ 20 февраля 2019

Вы могли бы написать что-то вроде

import numpy as np
...
'right': np.prod([grid[i][j] for j in range(i, i + amount)])
...