Python 如何在计算中跳过列表的sting元素?
我试图跳过字符串元素和浮点类型的乘法。我想避免零除错误。所以我尝试下面的代码Python 如何在计算中跳过列表的sting元素?,python,list,Python,List,我试图跳过字符串元素和浮点类型的乘法。我想避免零除错误。所以我尝试下面的代码 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'] Trac
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.3333,0.05,-1.0,'Na']
请告诉我该怎么做。感谢您的帮助。在下面的代码中
a=[i*0.5 if i != str else 0 for i in z]
您正在用类型str
检查i
,您应该做的是用str
检查i
的类型,如下所示
type(i) != str
您的根本问题是,正如其他人指出的那样,您没有正确地执行类型检查来检查您可以使用的实例的类型:
isinstance(str, x)
如果你关心继承权type(x)==str
或此类比较也有效,但不考虑继承。但实际上,我相信最好的解决办法是你不要混用float
已经有一个“not-a-number”: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]
>>> [0 if x != x else x for x in a]
[0.625, 0.3333333333333333, 0.05, -1.0, 0]
或者这个技巧,利用保证对于任何浮点
x
,x!=x
仅当x为nan时:
>>> [0 if math.isnan(x) else x for x in a]
[0.625, 0.3333333333333333, 0.05, -1.0, 0]
>>> [0 if x != x else x for x in a]
[0.625, 0.3333333333333333, 0.05, -1.0, 0]
但是
math.isnan
更为明确…您可以使用isinstance Yea,我们也可以这样做。[i*0.5如果不是isinstance(i,str),则s中的i为“Na”