python - 我正在为 Magic_square 命中编写代码(所有行、所有列和对角线的总和相等)但出现错误:-- 列表索引超出范围
问题描述
def magic_square(n):
magicSquare = []
for i in range(n):
l=[]
for j in range(n):
l.append(0)
magicSquare.append(l)
i=n//2
j=n-1
num = n*n
count = 1
while(count<=num):
if(i==-1 and j==n):
j = n-2
i = 0
else:
if(j==n):
j=0
if(i<0):
i=n-1
if(magicSquare[i][j]!=0): # here iam getting error sign as(list index out of range) . how to rectify this ???
i=i+1
j=j-2
continue
else:
magicSquare[i][j]=count
count+=1
i=i-1
j=j+1
for i in range(n):
for j in range(n):
print(magicSquare[i][j],end=" ")
print()
magic_square(3)
结果为:
runfile('D:/01The Joy of Computing Using Python/Spyder/Magic_square.py', wdir='D:/01The Joy of Computing Using Python/Spyder') Traceback(最近一次调用最后一次):
文件 "", 第 1 行, in runfile('D:/01使用 Python/Spyder/Magic_square.py 计算的乐趣', wdir='D:/01使用 Python/Spyder 计算的乐趣')
文件“C:\Users\intel\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py”,第 827 行,运行文件 execfile(文件名,命名空间)
文件“C:\Users\intel\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py”,第 110 行,在 execfile exec(compile(f.read(), filename, 'exec'), namespace)
文件“D:/01The Joy of Computing Using Python/Spyder/Magic_square.py”,第 56 行,位于 magic_square(3)
文件“D:/01The Joy Of Computing Using Python/Spyder/Magic_square.py”,第 41 行,在 magic_square if(magicSquare[i][j]!=0) 中:
IndexError:列表索引超出范围
解决方案
您的代码中存在一些逻辑问题,但我现在已修复它们......
def magic_square(n):
magicSquare = []
for i in range(n):
l=[]
for j in range(n):
l.append(0)
magicSquare.append(l)
i=0
j=(n-1)//2
num = n*n
count = 1
while(count<=num):
magicSquare[i][j] = count
count+=1
newi = (i-1) % n
newj = (j+1) % n
if magicSquare[newi][newj]:
i=(i+1) % n
else:
i = newi
j = newj
for i in range(n):
for j in range(n):
print(magicSquare[i][j],end=" ")
print()
magic_square(5)
您还可以使用 轻松制作原始列表[[None for _ in range(n)] for _ in range(n)]
,并且可以使用'\n'.join(' '.join(map(str, row)) for row in sq)
我还放了一个函数来检查下面的正方形是否有魔力:
def format_square(sq):
text = '\n'.join(' '.join(map(str, row)) for row in sq)
return text
def check_square(sq):
n = len(sq)
v_sum_list = set(sum(row) for row in sq)
if len(v_sum_list) > 1:
return False
h_sum_list = set(sum(sq[i][x] for x in range(n)) for i in range(n))
if len(h_sum_list) > 1:
return False
diagonals = set((
sum(sq[i][i] for i in range(n)),
sum(sq[n-i-1][n-i-1] for i in range(n))
))
if not (diagonals == h_sum_list == v_sum_list):
return False
return True
def gen_magic_square(n):
magic_square = [[None for _ in range(n)] for _ in range(n)]
if n % 2 == 1:
# odd
x = int((n-1) / 2)
y = 0
total_squares = n ** 2
filled_square_count = 1
while filled_square_count <= total_squares:
magic_square[y][x] = filled_square_count
filled_square_count += 1
newx = (x+1) % n
newy = (y-1) % n
if magic_square[newy][newx]:
y += 1
y %= n
else:
x = newx
y = newy
else:
raise ValueError("n must be odd")
return magic_square
sq = gen_magic_square(7)
print(check_square(sq))
print(format_square(sq))
推荐阅读
- python - 将输入框的输入保存到 .txt 文件中
- javascript - 这是“à¹,ค้à¸1.5ลิตร(M)” UTF 字符串还是 Ansi 字符串
- ios - 如何在 iOS 中执行不安全的 URLSession 查询
- spring-mvc - 无法从 persistence.xml 找到持久性提供程序
- angularjs - AngularJS 编译动态内容
- javascript - 在 jQuery 中使用正确的选择器无需重复代码
- drupal-7 - 在新节点 create 上,Drupal 给出错误消息“可能未引用图像字段中使用的文件。”
- arrays - 我可以使用 UnsafePointer.withMemoryRebound 将 [UInt8] 重新映射到 [UInt16] 吗?
- google-oauth - 如何查找用户的电子邮件 ID?- 谷歌 Oauth2 API PHP 客户端
- azure-api-management - URL 模板参数在 APIM 中不起作用