尝试使用try转换为数字除外

时间:2018-05-29 02:50:56

标签: python python-3.x types type-conversion 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"中的字符串,则会生成与D相同的列表L。所以......

  1. 如何跳过None项目?我是否必须使用if item == None: pass声明,还是有更好的方法?
  2. 为什么即使我将None更改为"None",类型转换也无效?

5 个答案:

答案 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)

  1. 是的,您只需使用if item == None: pass检查转换前的类型。
  2. 您可以使用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)