在Python中如何在混合列表中将数字转换为float

LWZ*_*LWZ 6 python string list

我有一个表格中的字符串列表,如

a = ['str','5','','4.1']
Run Code Online (Sandbox Code Playgroud)

我想将列表中的所有数字转换为浮点数,但保持其余数字不变,就像这样

a = ['str',5,'',4.1]
Run Code Online (Sandbox Code Playgroud)

我试过了

map(float,a)
Run Code Online (Sandbox Code Playgroud)

但显然它给了我一个错误,因为一些字符串不能转换为浮点数.我也试过了

a[:] = [float(x) for x in a if x.isdigit()]
Run Code Online (Sandbox Code Playgroud)

但它只给了我

[5]
Run Code Online (Sandbox Code Playgroud)

所以浮点数和所有其他字符串都会丢失.我该怎么做才能同时保留字符串和数字?

bgp*_*ter 7

>>> a = ['str','5','','4.1']
>>> a2 = []
>>> for s in a:
...     try:
...         a2.append(float(s))
...     except ValueError:
...         a2.append(s)
>>> a2
['str', 5.0, '', 4.0999999999999996]
Run Code Online (Sandbox Code Playgroud)

如果您正在进行十进制数学运算,您可能需要查看十进制模块:

>>> import decimal
>>> for s in a:
...     try:
...         a2.append(decimal.Decimal(s))
...     except decimal.InvalidOperation:
...         a2.append(s)
>>> a2
['str', Decimal('5'), '', Decimal('4.1')]
Run Code Online (Sandbox Code Playgroud)

  • @LWZ - 这就是浮点数的工作方式.请参阅[此问题](http://stackoverflow.com/questions/5997027/python-rounding-error-with-float-numbers). (2认同)
  • @LWZ:因为你不能把'4.1`完全表示为`float`.关于此,大约有69105.00000000000001个问题,所以如果您需要更多信息,请搜索. (2认同)

And*_*ark 6

for i, x in enumerate(a):
    try:
        a[i] = float(x)
    except ValueError:
        pass
Run Code Online (Sandbox Code Playgroud)

这假设您要更改a到位,要创建新列表,您可以使用以下内容:

new_a = []
for x in a:
    try:
        new_a.append(float(x))
    except ValueError:
        new_a.append(x)
Run Code Online (Sandbox Code Playgroud)

这种try/except方法是标准EAFP,并且比检查每个字符串是否为有效浮点数更有效且更不容易出错.


Roh*_*ain 5

这是一种无需异常处理和使用一些正则表达式的方法: -

>>> a = ['str','5','','4.1']
>>> import re
>>> [float(x) if re.match("[+-]?(?:\d+(?:\.\d+)?|\.\d+)$", x) else x for x in a]
4: ['str', 5.0, '', 4.1]
Run Code Online (Sandbox Code Playgroud)

请注意,此正则表达式仅涵盖基本范围的数字,适用于您的情况.对于更精细的正则表达式来匹配更广泛的浮点数,比如包括指数,你可以看一下这个问题: -