牛骨文教育服务平台(让学习变的简单)
博文笔记

用python实现数组

创建时间:2017-04-30 投稿人: 浏览次数:2023

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

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

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

例如:

输入:

3

输出:

7  8  1
6  9  2
5  4  3

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

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


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


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


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

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


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


所以,我们可以将原来的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("
")

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



阅读更多
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。