不能将序列乘以'list'类型的非int

时间:2013-02-09 20:15:59

标签: python

def evalPolynomial(coeffs,x):
        return sum([n for n in coeffs] * [x**(m-1)for m in range(len(coeffs),0,-1)]) 

TypeError:不能将序列乘以'list'

类型的非int

不确定导致错误的原因是什么?当我单独打印每个语句时,它们每个都给我一个列表,但是当我尝试将它们相乘时它不起作用。

3 个答案:

答案 0 :(得分:7)

Python list只能乘以一个整数,在这种情况下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会限制整数的大小,因此如果系数太大而导致溢出,则可能会得到错误的结果。

答案 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)) ] )

答案 2 :(得分: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))))