首页 > 解决方案 > IndexError:比较列表时元组索引超出范围

问题描述

我正在尝试将不正确的 3X3 幻方转换为正确的 3X3 幻方。这是我的代码:

from itertools import *
def ms():
    magic_squares = [
    [8,1,6],[3,5,7],[4,9,2],
    [6,1,8],[7,5,3],[2,9,4],
    [4,3,8],[9,5,1],[2,7,6],
    [2,7,6],[9,5,1],[4,3,8],
    [2,9,4],[7,5,3],[6,1,8],
    [4,9,2],[3,5,7],[8,1,6],
    [6,7,2],[1,5,9],[8,3,4],
    [8,3,4],[1,5,9],[6,7,2]
    ]
    for p in permutations(range(1,10)):
        if all(sum(p[i] for i in r) == 15 for r in magic_squares):
           yield list(p)
def closest_ms(m):
    m = sum(m, [])
    return min(ms(), key = (lambda x: sum(i != j for i,j in zip(m,x))))
s = []
smo = []
for s_i in range(3):
    s_t = [int(s_temp) for s_temp in input().strip().split(' ')]
    s.append(s_t)
important_var = closest_ms(s)
print(important_var)

如您所见,由于有 8 个正确的 3X3 幻方,我试图使用其中的八个通过可能的最小变化(使用数字 1-9)将不正确的幻方转换为正确的幻方。例如,我有一个这样的幻方:

[[5,3,4],[1,5,8],[6,4,2]]

输出应该是这样的,变化最小:

[[8,3,4],[1,5,9],[6,7,2]]

但是我的代码给了我这个错误:IndexError: tuple index out of range在第 14 行

我怎样才能克服这个错误并使我的代码按预期工作?

标签: pythonpython-3.x

解决方案


我没有考虑您的算法,但我可以看到问题出在此处:

all(sum(p[i] for i in r) == 15 for r in magic_squares)

每个 r 是一个包含数字 1-9 的 3 元素列表。所以 i 的可能值范围是 1-9。但是 p 是数字 1-9 的排列,因此 p 是具有 9 个元素的元组。p 的指数范围为 0-8。


推荐阅读