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

類型錯誤的非INT繁衍序列:不能按類型「列表」無法按類型「列表」

不知道是什麼導致了錯誤的非INT繁衍序列?當我分別打印每個報表時,他們每個人都給我一個列表,但是當我嘗試將它們相乘時,它不起作用。

+0

究竟是你想做些什麼? – 2013-02-09 20:16:46

+0

對於列表coeffs和變量x,返回序列a-sub(n)* x ^(n)+ a-sub(n-1)* x ^(n-1)... a- sub(0)* x * 0 – user2057593 2013-02-09 20:18:07

+0

這是多項式估計 – user2057593 2013-02-09 20:19:56

回答

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)))) 
+0

明白了 - 謝謝! – user2057593 2013-02-09 20:27:13

3

的Python list s只能由整數相乘,在這種情況下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會限制整數的大小,因此如果係數太大而導致溢出,您可能會得到錯誤的結果。

+0

Python列表可以乘以一個變量。實際上要清楚,我試圖創建一個可變長度的2D列表。我發佈了我的2行代碼片段。 #code def buildAdjMat(matLen): adjMat = [[0] * int(matLen)] * int(matLen) – 2015-03-24 15:22:15

+1

@SteveJobs當我說* integer *我的意思是任何表達式的評估結束於一個值爲類型整數。 – Bakuriu 2015-03-24 15:24:13

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