我试图将多个类型列表中的项目转换为浮点数,以便
L = ["29.3", "tea", "1", None, 3.14]
会变成
D = [29.3, "tea", 1, None, 3.14]
我的尝试如下:
L = ["29.3", "tea", "1", None, 3.14]
D = []
for item in L:
try:
float(item)
D.append(item)
except ValueError:
D.append(item)
print(D)
这会抛出一个
line 5, in <module> float(item) TypeError: float() argument must be a string or a number, not 'NoneType'` error.
如果我将None
项更改为"None"
中的字符串,则会生成与D
相同的列表L
。所以......
None
项目?我是否必须使用if item == None: pass
声明,还是有更好的方法?None
更改为"None"
,类型转换也无效?答案 0 :(得分:2)
您可以直接在try
区块中执行追加:
try:
D.append(float(item))
except (ValueError, TypeError):
D.append(item)
L = ["29.3", "tea", "1", None, 3.14]
D = []
for item in L:
try:
D.append(float(item))
except (ValueError, TypeError):
D.append(item)
print(D)
[29.3, 'tea', 1.0, None, 3.14]
答案 1 :(得分:2)
如果为float
构造函数提供的不是字符串或数字,则会引发TypeError
而不是ValueError
。你需要抓住两者。
这是使用list-comprehension的方法。
def try_float(x):
try:
return float(x)
except (ValueError, TypeError):
return x
l = ["29.3", "tea", "1", None, 3.14]
d = [try_float(x) for x in l]
print(d) # [29.3, 'tea', 1.0, None, 3.14]
答案 2 :(得分:1)
try-except
用于捕获异常。在这种情况下,您只考虑一个例外,ValueError
但不是TypeError
。为了捕获类型错误,只需在except
下方添加一个try
块。在你的情况下,它会是这样的:
L = ["29.3", "tea", "1", None, 3.14]
D = []
for item in L:
try:
float(item)
D.append(float(item))
except TypeError:
# do something with None here
except ValueError:
D.append(item)
print(D)
鉴于您希望在单个except
块中捕获多个异常,请使用异常元组:
L = ["29.3", "tea", "1", None, 3.14]
D = []
for item in L:
try:
float(item)
D.append(float(item))
except (ValueError, TypeError):
D.append(item)
print(D)
答案 3 :(得分:1)
if item == None: pass
检查转换前的类型。if isinstance(item, str): ...
将字符串显式转换为float。答案 4 :(得分:0)
尝试cincudate错误,在最后一种情况下使用它们。因此,如果错误是在NoneType中,您可以尝试使用if var is type:
或if is isinstance(var, type):
进行电子转播
在其他类型如bool(True / False)中,你应该使用eval(var)将它们转换为bool。
L = ["29.3", "tea", "1", None, 3.14]
D = []
for item in L:
if item is None:
D.append(item)
pass
else:
try:
D.append(float(item))
except ValueError or TypeError:
D.append(item)