用python实现数组

用python实现数组

今天想练习一下python,就决定用python实现一下数组的功能。因为python中没有数组。

题目:用二维数组实现蛇形填数,用户输入一个数字N,程序应该输出一个N×N的蛇形数组(要求:数组按照

顺时针方向填数,右上角为起点,且起点定为1)。

例如:

输入:

3

输出:

7  8  1
6  9  2
5  4  3

一开始,我打算用列表来实现二维数组的功能,并且我使用*号运算符。代码如下:

array = [ [0] * N ] * N
用该表达式似乎可以生成一个二维数组,效果图如下:

用python实现数组_第1张图片

但是当我将代码完全写完时发现,好像并不能完成题目的要求。

用python实现数组_第2张图片

经过调试,我发现问题出在给数组赋值的地方。

用python实现数组_第3张图片

本来我们只是想给数组元素array[0][N-1]赋值为1,结果程序将每一行的随后一个元素都赋值成1。这是什么原因?

查阅文档后,我发现官方是这么说的:

用python实现数组_第4张图片

大概意思是说*号运算只是对原来数据的多次引用,也就是说实际上,我们用*号创建的二位数组其实只是将原来的一位数组复制了多次,我们并不能用其实现二维数组的功能。官方推荐使用列表生成式:

用python实现数组_第5张图片

所以,我们可以将原来的array = [ [0] * N] * N改成array=[[0 for i in range(N)] for j in range(N)],所以改进后的完整代码如下:

__author__ = 'Mochazz'
def main():
    N = int(input('请输入数字:'))
    # array = [ [0] * N ] * N
    array = [[0 for i in range(N)] for j in range(N)]
    x ,y = 0,N - 1
    tot = array[x][y] = 1
    while(tot < N * N):
        while(x+1 < N and (not array[x+1][y])):
            tot += 1
            x += 1
            array[x][y] = tot
        while(y-1 >= 0 and not array[x][y-1]):
            tot += 1
            y -= 1
            array[x][y] = tot
        while(x-1 >= 0 and not array[x-1][y]):
            tot += 1
            x -= 1
            array[x][y] = tot
        while(y+1 < N and not array[x][y+1]):
            tot += 1
            y += 1
            array[x][y] = tot
    for i in range(N):
        for j in range(N):
            print('%-2d' % array[i][j], end=' ')
        print('\n')

if __name__ == '__main__':
    main()
运行结果如下:

用python实现数组_第6张图片

你可能感兴趣的:(python3编程)