2017-08-29 78 views
0

我想跳過字符串元素和浮點類型的乘法。我想避免零分割錯誤。所以我嘗試下面的代碼。如何在計算中跳過列表中的sting元素?

x =[5,2,0.2,-2,1] 
y=[4,3,2,1,0] 
z=[m/n if m and n !=0 else "Na" for m,n in zip(x,y)] 
print(z) 
a=[i*0.5 if i != str else 0 for i in z] 
print(a) 

當我運行上面的代碼。我得到了這個結果。

[1.25, 0.6666666666666666, 0.1, -2.0, 'Na'] 
Traceback (most recent call last): 
a=[i*0.5 if i != str else 'Na' for i in z] 
TypeError: can't multiply sequence by non-int of type 'float' 

Process finished with exit code 1enter code here 

我想達到的目標是: A = [0.625,0.3333333333333333,0.05,-1.0, '娜']

請點我了我該怎麼辦。謝謝你的幫助。

+0

'[[i * 0.5 if is not isinstance(i, str)else'Na'for i in s]' –

回答

1

你的根本問題是,你的istr檢查類型正如其他人指出的那樣,沒有正確地進行類型檢查,以檢查您可以使用的實例的類型:

isinstance(str, x) 

如果你關心繼承。 type(x) == str或此類比較也適用,但不考慮繼承。但是,真的,我相信最好的解決方案是讓你不要混合類型。 float已經有一個「不是一個數字」:float('nan'),所以只需使用:

>>> x =[5,2,0.2,-2,1] 
>>> y=[4,3,2,1,0] 
>>> z=[m/n if m and n !=0 else float('nan') for m,n in zip(x,y)] 
>>> z 
[1.25, 0.6666666666666666, 0.1, -2.0, nan] 
>>> [i*0.5 for i in z] 
[0.625, 0.3333333333333333, 0.05, -1.0, nan] 

那麼你不必擔心類型檢查。

然後你就可以用math.isnan後來清理:

>>> [0 if math.isnan(x) else x for x in a] 
[0.625, 0.3333333333333333, 0.05, -1.0, 0] 

或者這一招,以保證優勢,對於任何floatxx != x僅當x是nan

>>> [0 if x != x else x for x in a] 
[0.625, 0.3333333333333333, 0.05, -1.0, 0] 

math.isnan更明確...

+0

你讓我的一天兄弟。謝謝你的解釋。 – Soros

0
下面的代碼

a=[i*0.5 if i != str else 0 for i in z] 

您正在使用str類型檢查i

,你應該做的是像下面

type(i) != str 
+0

你可以使用isinstance –

+0

是的,我們也可以這樣做。 –