无法用非整数类型'列表'与序列相乘

6 投票
3 回答
75257 浏览
提问于 2025-04-17 15:22
def evalPolynomial(coeffs,x):
        return sum([n for n in coeffs] * [x**(m-1)for m in range(len(coeffs),0,-1)]) 

类型错误:不能用非整数的类型'列表'去乘以一个序列。

不太明白这个错误是怎么回事?当我分别打印每个语句时,它们都给我一个列表,但当我尝试把它们相乘时就不行了。

3 个回答

1

你想把两个列表相乘,但在Python中这是不允许的。

如果你想把两个列表中对应位置的元素相乘,可以使用下面的方式:

def evalPolynomial(coeffs,x):
        return sum(x * y for x, y in zip(coeffs, (x**(m-1)for m in range(len(coeffs),0,-1))))
2

这个表达式 [n for n in coeffs] 是一个整数的 list(列表)。
列表确实可以用一个整数来进行乘法运算,但这意味着“生成一个包含 n 个起始列表副本的新列表”;在这个数学上下文中,这并不是你想要的结果。

我建议你看看 numpy(或者 scipy,它基本上是 numpy 的一个扩展)这个库来帮助你解决这个问题。它有一个函数 polyval,可以精确地计算你想要的结果,同时也提供了一个基于类的表示 polynomial。一般来说,如果你想在 Python 中进行数值计算,应该考虑使用这些库。

不过,如果你想自己动手实现,你需要在列表推导式中进行数学运算,下面是一种实现方式:

return sum( [ n*x**(i-1) for (n,i) in zip( coeffs, xrange(len(coeffs),0,-1)) ] )
14

在Python中,list(列表)只能用整数来进行乘法运算,这样做的结果是列表里的元素会重复出现:

>>> [1,2,3] * 3
[1, 2, 3, 1, 2, 3, 1, 2, 3]

如果你想进行向量运算,建议使用numpy.ndarray,这是一种更适合的选择:

>>> import numpy as np
>>> ar = np.array([1,2,3])
>>> ar * 3
array([3, 6, 9])

特别是,numpy里有一个专门用于卷积的函数(也就是多项式乘法):

>>> a = np.array([1,2,3]) # 1 + 2x + 3x^2
>>> b = np.array([4,5,6]) # 4 + 5x + 6x^2
>>> np.convolve(a, b)     # (1 + 2x + 3x^2) * (4 + 5x + 6x^2)
array([ 4, 13, 28, 27, 18]) # 4 + 13x + 28x^2 + 27x^3 + 18x^4

如果你想计算一个多项式的值,可以使用numpy.polyval这个函数,它可以帮你完成这个任务。

需要注意的是,使用numpy时,整数的大小是有限制的,如果你的系数太大,可能会导致结果出错。

撰写回答