解释器说n=list[0]是一个列表

2024-09-30 12:19:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我必须做一个接受数组的函数,其中第一个元素是矩阵的列数和行数,其余的是矩阵本身。我必须返回对角线和之间的绝对差

我的问题是解释器返回此回溯:

File "Solution.py", line 23, in diagonalDifference
    while counter != n + 1:
TypeError: can only concatenate list (not "int") to list

我不知道为什么它像列表一样包含“n”,它是“lis”列表的第一个元素

这是密码

def diagonalDifference(arr):
    sumleftdiagonal = 0
    sumrightdiagonal = 0
    counter = 0
    lis = [i for i in arr]
    n = lis[0]
    lis.remove(lis[0])
    while counter != n + 1:
        sumleftdiagonal += lis[0 + counter]
        sumrightdiagonal += [n - counter]
        counter += 1
        for i in lis[:n+1]:
            lis.remove(i)

    return abs(sumleftdiagonal - sumrightdiagonal)

Tags: in元素列表forcounter矩阵数组remove
2条回答
sumrightdiagonal += [n - counter]

在这一行中,您试图附加一个包含n - counter的列表,我假设您在这里指的是lis[n - counter]

解决方案

您的代码不起作用,因为您实际上是在计算方阵第一行与自身的差异

# this picks up members of first row (left to right)
sumleftdiagonal += lis[0 + counter]
# this picks up members of first row (right to left)
sumrightdiagonal += [n - counter]
counter += 1

您可以验证我使用的伪数据的sumleftdiagonal = [ 1, 2, 3, 4, 5]sumrightdiagonal = [5, 4, 3, 2, 1]

纯肾盂液

方法一:just python

# using the dummy data below: sum(diag_left - diag_right) = 0
n = arr[0]
sum([arr[1+n*i+i] - arr[1+(n-1)*(i+1)] for i in range(n)])

输出

0

使用numpy

如果您可以使用numpy,那么至少有两种方法

方法2:使用numpy

import numpy as np

def diagdiff(arr):
    n, arr = arr[0], arr[1:]
    arr = np.array(arr).reshape((n,n))
    return sum(np.diag(arr) - np.diag(np.fliplr(arr)))

# Dummy Data
a = np.arange(25).reshape((5,5)) + 1
print(f'square-array: \n\n{a}\n')
arr = [int(np.sqrt(a.size))] + a.flatten().tolist()
dd = diagdiff(arr)
print(f'diagonal-difference: {dd}')

输出

square-array:

[[ 1  2  3  4  5]
 [ 6  7  8  9 10]
 [11 12 13 14 15]
 [16 17 18 19 20]
 [21 22 23 24 25]]

diagonal-difference: 0

方法3:使用numpy

n, a = arr[0], np.array(arr[1:])
a = a.reshape((n,n))
sum([a[i, 0+i] - a[i, -(1+i)] for i in range(n)])

输出

0

相关问题 更多 >

    热门问题