我有一个字符串列表,如
a = ['str','5','','4.1']
我想将列表中的所有数字转换为浮点数,但保持其余数字不变,如此
a = ['str',5,'',4.1]
我试过
map(float,a)
但显然它给了我一个错误,因为某些字符串无法转换为float。我也试过
a[:] = [float(x) for x in a if x.isdigit()]
但它只给了我
[5]
所以浮点数和所有其他字符串都会丢失。我该怎么做才能同时保留字符串和数字?
答案 0 :(得分: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')]
答案 1 :(得分: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,并且比检查每个字符串是否为有效浮点数更有效且更不容易出错。
答案 2 :(得分: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]
请注意,此正则表达式仅涵盖基本范围的数字,适用于您的情况。对于更精细的正则表达式来匹配更广泛的浮点数,比如包括指数,你可以看一下这个问题: -
答案 3 :(得分:4)
我的版本:
def convert(value):
try:
return float(value)
except ValueError:
return value
map(convert, a)