7

我有一个字符串列表,格式如下

a = ['str','5','','4.1']

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

a = ['str',5,'',4.1]

我试过

map(float,a)

但显然它给了我一个错误,因为某些字符串无法转换为浮点数。我也试过

a[:] = [float(x) for x in a if x.isdigit()]

但它只给了我

[5]

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

4

4 回答 4

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]

如果你正在做十进制数学,你可能想看看十进制模块:

>>> 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')]
于 2013-01-31T19:37:43.310 回答
6
for i, x in enumerate(a):
    try:
        a[i] = float(x)
    except ValueError:
        pass

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

new_a = []
for x in a:
    try:
        new_a.append(float(x))
    except ValueError:
        new_a.append(x)

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

于 2013-01-31T19:36:45.420 回答
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]

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

于 2013-01-31T19:43:20.127 回答
4

我的版本:

def convert(value):
    try:
        return float(value)
    except ValueError:
        return value

map(convert, a)
于 2013-01-31T19:49:27.900 回答