来自文本文件的矩阵的对角线(无 Numpy)

Diagonal of A Matrix From A Text File (No Numpy)

我试图在不使用任何类型的模块的情况下从文本文件中获取矩阵的对角线。所以文本文件可以是这样的:

[[1,2,3],[4,5,6],[7,8,9]]

到目前为止,这是我的代码:

def diagonal(filename): 
    with open(filename, 'r') as myfile:
        data=myfile.read().split()
        a=data[0].split()
    a=eval(a[0])
    c=len(a[0])
    d=len(a)
    if c==d:
        diagonal=[]
        c=len(a[0])
        for i in range(d):
            row=[0]*c
            for j in range(c):
                row=a[i][j]
                diagonal.append(row)
        return diagonal
    else:
        return ('Error')

这个returns:

[1, 2, 3, 4]

当我想要它输出时:

[[1,0,0],[0,5,0],[0,0,9]]

关于如何使我的代码工作的任何想法?非常感谢!

您可以这样做(给定输入列表的示例):

l = [[1,2,3],[4,5,6],[7,8,9]] #Your input-list
new_list = [] #New output-list

for arr, num in zip(l, range(len(l))):
    new_arr = [0 for x in range(len(l))]
    new_arr[num] = arr[num]
    new_list.append(new_arr)

这是通用的,因此您可以拥有任意长度的矩阵。

编辑:带有枚举的版本:

for num, arr in enumerate(l):
    new_arr = [0 for x in range(len(l))]
    new_arr[num] = arr[num]
    new_list.append(new_arr)

这不就是简单的嵌套列表推导吗:

arr = [[1,2,3],[4,5,6],[7,8,9]]

diag = [[arr[i][i] if i == j else 0 for j in range(len(el))]
       for i, el in enumerate(arr)]
# -> [[1, 0, 0], [0, 5, 0], [0, 0, 9]]