2017-08-29 47 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

是的,我们也可以这样做。 –