使用Python创建一个矩阵的方法(基于列表)

3
在Python中,可以使用嵌套列表创建矩阵。例如,[[1, 2], [3, 4]]。下面我编写了一个函数,提示用户输入方阵的尺寸,然后在for循环中提示用户输入值。我有一个tempArray变量,它临时存储一行值,然后在附加到矩阵数组后被删除。但不知何故,在最后打印矩阵时,我得到的是这样的:[ [ ], [ ] ]。出了什么问题?
def proj11_1_a():
    n = eval(input("Enter the size of the square matrix: "))
    matrix = []
    tempArray = []   

    for i in range(1, (n**2) + 1):
        val = eval(input("Enter a value to go into the matrix: "))

        if i % n == 0:
            tempArray.append(val)
            matrix.append(tempArray)
            del tempArray[:]
        else:
            tempArray.append(val)
    print(matrix)
proj11_1_a()

这段代码没有任何输出。 - lejlot
抱歉,我删掉了那行代码。 - Rehaan Advani
为什么要删除你的数组?del tempArray[:] - lejlot
数组仅在具有一行值后才被删除。删除的原因是为了可以存储下一行值,然后将其附加到矩阵数组中。 - Rehaan Advani
2个回答

2

您只需删除数组元素del tempArray [:],由于列表是可变的,因此它也会清除matrix的部分内容。

def proj11_1_a():
    n = eval(input("Enter the size of the square matrix: "))
    matrix = []
    tempArray = []   

    for i in range(1, (n**2) + 1):
        val = eval(input("Enter a value to go into the matrix: "))

        if i % n == 0:
            tempArray.append(val)
            matrix.append(tempArray)
            tempArray = [] #del tempArray[:]
        else:
            tempArray.append(val)
    print(matrix)
proj11_1_a()

这可以进一步简化/清晰为

def proj11_1_a():
    # Using eval in such place does not seem a good idea
    # unless you want to accept things like "2*4-2"
    # You might also consider putting try: here to check for correctness

    n = int(input("Enter the size of the square matrix: "))
    matrix = []

    for _ in range(n): 
        row = []   

        for _ in range(n): 
            # same situation as with n
            value = float(input("Enter a value to go into the matrix: "))
            row.append(value)

        matrix.append(row)

    return matrix

你终将执行 append(val),所以最好从 if/else 代码块中将其提取出来。 - user1040495
@Jjpx - 这是一个OP代码,只是引起问题的片段被更改了,这里有很多可以改善的地方。 - lejlot
1
正如@Jjpx所建议的,您可以同时提供最佳版本。我认为对于提问者来说,同时拥有两个版本会很有益处。 - Budo Zindovic

1
另一种解决方案是更改以下行:

matrix.append(tempArray)

至:

matrix.append(tempArray.copy())

1
这是次优的,因为你需要复制对象(如果它很大,就需要线性时间)。 - lejlot
由于最初的意图是提示用户进行输入,因此与用户输入的速度相比,开销是最小的。 - Budo Zindovic
当然,但这并不意味着我们应该在其他地方编写不足的代码。我们也不应该建议学习Python的人(例如OP)这样做。 - lejlot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接