2012-05-18 30 views
3

我在Python中列表有問題。Python中的列表 - AttributeError:'str'對象沒有屬性'coeffs'

這裏是一個簡單的代碼:

x = [scipy.poly1d([ 1., 0., 0.]),2,3,4,5,'foward'] 
for i in range (len(x)) : 
    if x [i] == 'foward': 
     print 'check!' 

時,它的運行,它會說:

return NX.alltrue(self.coeffs == other.coeffs) AttributeError: 'str' object has no attribute 'coeffs'

但是當我改變X成:

x = [1,2,3,4,5,'foward'] 

程序會運行沒問題。

有沒有人可以向我解釋爲什麼?我該怎麼辦?實際上,我有一個數據(x)的修復列表,它返回上面的屬性錯誤,我不想改變它的格式和它包含的內容。

+0

你應該正確地格式化代碼。你的縮進是錯誤的。 –

回答

5
if isinstance(x[i], basestring) and x[i] == 'forward' 

或快速和髒:

if str(x[i]) == 'forward' 

你也應該使用for .. in循環遍歷列表:

for elem in x: 
    if isinstance(elem, basestring) and elem == 'forward': 
     print 'Check' 

如果您還需要i

for i, elem in enumerate(x): 
+0

我比較(+1)之前喜歡鑄造字符串。使用'isinstance'我不太喜歡...(雖然仍然是一個完全有效的答案) – mgilson

+0

那麼,你永遠不會知道某個對象上的'str()'是否可能很昂貴。特別是對於一個可能很大的數學對象,這不是一個太過遙遠的可能性。 – ThiefMaster

+0

是的,但是你也永遠不知道一個非字符串對象是否覆蓋'__eq__',以便它可以返回'True'來進行測試...... – mgilson

1

我猜測,給你這個問題的平等檢查是在scipy.poly1d。該類可能通過比較兩個「多項式」係數來定義平等檢查。由於字符串「forward」沒有coeff屬性,所以會出現錯誤。

一個簡單的解決方法是把if語句在try/except塊:

try: 
    if x[i] == 'forward': 
     print 'check' 
except AttributeError: 
    pass 

的另一件事 - 一般是在做:

for i in range(len(obj)): 
    x=obj[i] 
    ... 

是不使用最好的成語。一個更好的成語是:

for i,x in enumerate(obj): 
    ... 
0

如果你只是想檢查,如果「盼着」在列表中,您還可以使用

if 'foward' in [i for i in x if isinstance(i, basestring)]: 
    print 'check' 
相關問題