我可以直接使用字典本身中的for循环在字典中定义一个值吗?

2024-04-29 20:00:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我在研究一些欧拉问题,有一个解决方案,我想让它更具适应性。问题本身在这里并不重要,但对于那些好奇的人来说,问题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]

我想做的是将字典中的值替换为一些我可以改变的值(以数量为单位),我考虑使用一个for循环,范围从0到amount-1,如下所示:

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

然而,我不确定这是否可能,如果可能,如何实现它

有什么建议吗


Tags: keyinrightforlenrange整数解决方案
2条回答

在当前的实现中,无论何时都不会得到max_dic结果 任何碎片都超出了网格边界。经常遇到这样的问题,你 你确实想要一个部分的结果。如果是的话,你可能想 以更细粒度的方式处理IndexError的能力。例如, 您可以创建一个简单的helper函数,它包含一个网格和两个索引以及 返回值或某个默认值(在乘法的情况下是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)]),
}

你可以这样写

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

相关问题 更多 >