python - 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 行
我怎样才能克服这个错误并使我的代码按预期工作?
解决方案
我没有考虑您的算法,但我可以看到问题出在此处:
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。
推荐阅读
- c++ - 在 Win32 应用程序中托管 GTK+3 上下文
- java - Java JNA - 捕获所有消息
- internet-explorer - Selenium click () with 75% zoom in IE 不工作
- intellij-idea - 如何在 Ubuntu 18.04 上修复 Intellij Idea Ultmate 2018.02 中的文件夹显示
- python-3.x - 无法在 balebot 中使用 time.sleep() 发送一组消息
- php - PHP从另一台服务器执行nodejs
- spring-security - Spring open id connect中隐式模式的目的是什么?
- r - 在单个空间点进行克里金法?
- vb6 - VB6中的“需要对象”分配函数结果
- java - Java JaxB Unmarshaller 给出 org.xml.sax.SAXParseException 文件过早结束