首页 > 解决方案 > 我正在为 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:列表索引超出范围

标签: pythonpython-3.x

解决方案


您的代码中存在一些逻辑问题,但我现在已修复它们......

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))

推荐阅读