繁体   English   中英

如何理解我为问题编写的Python代码

[英]How to understand the Python code I wrote for a problem

如果我给2输出是

2 2 2
2 1 2
2 2 2

而3是

3 3 3 3 3
3 2 2 2 3
3 2 1 2 3
3 2 2 2 3
3 3 3 3 3

代码如下:

def square(arr, val):

    if val is 1:
        return [[1]]    //self understandable

    n = val + (val - 1)       //getting array size, for 2 its 3

    sideAdd = [val] * n              
    arr.insert(0, sideAdd)      //for 2 it add [2,2,2] at first
    arr.append(sideAdd)         //append [2,2,2]

    for i in range(1, n-1):      //for inner elements add val to either sides
        arr[i].insert(0, val)    // like, for 2 [val,1,val]
        arr[i].append(val)


    return(arr)


array = square([[2, 2, 2], [2, 1, 2], [2, 2, 2]], 3)


# print(array)
for i in array:
    print(*i)

输出如下:

3 3 3 3 3
3 2 2 2 3
3 2 1 2 3
3 2 2 2 3
3 3 3 3 3

这是正确的答案。

但是当我尝试通过for循环提供值并通过相同的函数再次将返回的数组作为参数发送来完成整个解决方案时

n = 3  
arr = []

for i in range(1, n+1):

    arr = square(arr, i)

整个代码是

def square(arrx, val):

    if val is 1:
        return [[1]]

    n1 = val + (val - 1)

    sideAdd = [val] * n1
    arrx.insert(0, sideAdd)
    arrx.append(sideAdd)


    for i in range(1, n1-1):
        arrx[i].insert(0, val)
        arrx[i].append(val)

    return arrx


n = 3
arr = []

for i in range(1, n+1):

    arr = square(arr, i)



for i in arr:
    print(*i)

返回的答案为:

3 3 3 3 3
3 3 2 2 2 3 3
3 2 1 2 3
3 3 2 2 2 3 3
3 3 3 3 3

这是错的

我已经尝试过在pycharm中以调试模式运行,那里出现了异常现象。 查看下面的屏幕截图。 当j = 1(索引)时,代码在蓝色下划线中插入2,但也在红色中插入,这不应该,因为红色下划线索引为3(在j = 3处应插入2),并且当j = 3时,再次在索引处插入1(j = 1)正在发生,这使得输出3 3 2 2 2 3 3而不是3 2 2 2 3。

我不明白那是怎么回事。 屏幕截图如下:

https://imgur.com/yce47Pi

我认为您正在使这一过程变得比所需的复杂。 您可以单独从它们的索引确定任何单元格的正确值。 给定大小n和行/列[i,j] ,值是:

max(abs(n - 1 - j) + 1, abs(n - 1 - i) + 1)

例如:

def square(n):
    arr = []

    for i in range(n + n-1):
        cur = []
        arr.append(cur)
        for j in range(n + n -1):
            cur.append(max(abs(n - 1 - j) + 1, abs(n - 1 - i) + 1))
    return arr

然后

> square(3)  

[[3, 3, 3, 3, 3],
 [3, 2, 2, 2, 3],
 [3, 2, 1, 2, 3],
 [3, 2, 2, 2, 3],
 [3, 3, 3, 3, 3]]

> square(5)

[[5, 5, 5, 5, 5, 5, 5, 5, 5],
 [5, 4, 4, 4, 4, 4, 4, 4, 5],
 [5, 4, 3, 3, 3, 3, 3, 4, 5],
 [5, 4, 3, 2, 2, 2, 3, 4, 5],
 [5, 4, 3, 2, 1, 2, 3, 4, 5],
 [5, 4, 3, 2, 2, 2, 3, 4, 5],
 [5, 4, 3, 3, 3, 3, 3, 4, 5],
 [5, 4, 4, 4, 4, 4, 4, 4, 5],
 [5, 5, 5, 5, 5, 5, 5, 5, 5]]

编辑

当前代码的问题是这样的:

sideAdd = [val] * n              
arr.insert(0, sideAdd)      
arr.append(sideAdd)  

您两次向同一数组( sideAdd )添加引用。 因此,稍后添加以下列时:

arrx[i].insert(0, val)
arrx[i].append(val)

如果这两个数组是在较早的循环中添加的,则它们是相同的。 添加到第一个数组还会将一个添加到第二个数组,添加到第二个数组则会添加到第一个数组。 因此,您最终要做两次。 有几种方法可以解决此问题,但是最简单的方法是第二次添加副本:

sideAdd = [val] * n              
arr.insert(0, sideAdd)   
arr.append(sideAdd[:]) # Make a copy — don't add the same reference

我们可以在这里使用numpy的广播规则:

>>> np.maximum(np.abs(np.arange(-2, 3)[:, None]), np.abs(np.arange(-2, 3))) + 1
array([[3, 3, 3, 3, 3],
       [3, 2, 2, 2, 3],
       [3, 2, 1, 2, 3],
       [3, 2, 2, 2, 3],
       [3, 3, 3, 3, 3]])

因此,我们可以使用以下方式渲染多维数据集:

将numpy导入为np

def cube(n):
    ran = np.abs(np.arange(-n+1, n))
    cub = np.maximum(ran[:, None], ran) + 1
    return '\n'.join(' '.join(map(str, row)) for row in cub)

例如:

>>> print(cube(1))
1
>>> print(cube(2))
2 2 2
2 1 2
2 2 2
>>> print(cube(3))
3 3 3 3 3
3 2 2 2 3
3 2 1 2 3
3 2 2 2 3
3 3 3 3 3
>>> print(cube(4))
4 4 4 4 4 4 4
4 3 3 3 3 3 4
4 3 2 2 2 3 4
4 3 2 1 2 3 4
4 3 2 2 2 3 4
4 3 3 3 3 3 4
4 4 4 4 4 4 4
>>> print(cube(5))
5 5 5 5 5 5 5 5 5
5 4 4 4 4 4 4 4 5
5 4 3 3 3 3 3 4 5
5 4 3 2 2 2 3 4 5
5 4 3 2 1 2 3 4 5
5 4 3 2 2 2 3 4 5
5 4 3 3 3 3 3 4 5
5 4 4 4 4 4 4 4 5
5 5 5 5 5 5 5 5 5

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM