IndexError:比较列表时元组索引超出范围

时间:2018-05-16 04:35:01

标签: python python-3.x

我正在尝试将一个不正确的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魔方,我试图利用它们中的8个通过可能的最小变化将不正确的魔方转换为适当的魔方(使用数字1- 9)。例如,我有一个像这样的魔方:

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

输出应该是这样的,只需要很小的改动:

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

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

如何解决此错误并使我的代码按预期工作?

1 个答案:

答案 0 :(得分:1)

我没有想到你的算法,但我可以看到问题出在这里:

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。