【问题标题】:Trying to convert to numbers with try except尝试使用 try except 转换为数字
【发布时间】:2018-11-07 14:18:19
【问题描述】:

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

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",类型转换还是不行?

【问题讨论】:

  • 你想把None转换成什么?
  • float(item) 没有实现任何目标,因为它没有重新分配 item。使用item = float(item)

标签: python python-3.x types type-conversion try-except


【解决方案1】:

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)

【讨论】:

  • 关于你上次的更新,我编辑了。您不应捕获任何异常,除非在某些特定情况下,例如在重新引发之前记录错误。这样做的原因是,如果引发了您没有预料到的异常,那么您绝对不希望它静默通过,因为它是一个 bug。错误绝不应该默默地过去。
【解决方案2】:

尝试 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)

【讨论】:

    【解决方案3】:

    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]
    

    【讨论】:

      【解决方案4】:
      1. 是的,你可以简单地使用if item == None: pass在转换前检查类型。
      2. 您可以使用if isinstance(item, str): ... 将字符串显式转换为浮点数。

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-10-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多