尝试使用 try except 转换为数字

Trying to convert to numbers with try except

我正在尝试将多种类型列表中的项目转换为浮点数,以便

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" 中的字符串,它会生成一个与 L 相同的列表 D。所以...

  1. 如何跳过 None 项?我必须使用 if item == None: pass 语句,还是有更好的方法?
  2. 为什么我将 None 更改为 "None" 类型转换仍然不起作用?

您可以直接在 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]

try-except 用于捕获异常。在这种情况下,您只考虑一个例外,ValueError 而不是 TypeError。为了捕获类型错误,只需在 try 下面再放一个 except 块。在你的情况下,它会是这样的:

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)
  1. 是的,您可以简单地使用if item == None: pass在转换前检查类型。
  2. 您可以使用 if isinstance(item, str): ... 将字符串显式转换为浮点数。

float 构造函数被赋予字符串或数字以外的其他内容时,它会引发 TypeError 而不是 ValueError。你需要两者都抓住。

这是一种使用列表理解的方法。

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]

尝试排除错误,在最后一个案例中使用它们。因此,如果错误在 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)