【问题标题】:Can I define a value in a dictionary directly using a for loop within the dictionary itself?我可以使用字典本身中的 for 循环直接在字典中定义一个值吗?
【发布时间】:2019-02-20 11:47:46
【问题描述】:

我正在处理一些 Project Euler 问题,并且有一个解决方案我想让它更具适应性。问题本身在这里并不重要,但对于那些好奇的人来说,这是问题 11。

目前,我有一个由 20 x 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

但是,我不确定这是否可行,如果可行,如何实现。

关于如何做到这一点的任何建议?

【问题讨论】:

    标签: python dictionary int grid-layout


    【解决方案1】:

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

    【讨论】:

    • 非常好,我没想过这样做,现在我看到它似乎很明显。正如我预期的那样,比以前的硬编码版本慢,但没有我想象的那么慢。谢谢:D
    【解决方案2】:

    你可以写类似的东西

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

    【讨论】:

      猜你喜欢
      • 2022-01-01
      • 2017-06-30
      • 2022-11-17
      • 1970-01-01
      • 2017-04-05
      • 1970-01-01
      • 2021-12-17
      • 2019-06-14
      • 2020-04-08
      相关资源
      最近更新 更多