Python: 将字符串转换为十进制数

73

我有一个包含字符串的Python列表,格式如下:

A1 = [' "29.0" ',' "65.2" ',' "75.2" ']

我该如何将这些字符串转换为十进制数,以便对列表元素执行算术运算?

8个回答

104

如果您希望结果为最接近的二进制浮点数,请使用float

result = [float(x.strip(' "')) for x in A1]

如果你想要精确存储结果,使用 Decimal 替换 float

from decimal import Decimal
result = [Decimal(x.strip(' "')) for x in A1]

测试了一下,发现它不起作用,因为字符串中有空格和额外的引号。 - Jake

23

如果您要将价格(字符串形式)转换为十进制价格,则....

from decimal import Decimal

price = "14000,45"
price_in_decimal = Decimal(price.replace(',','.'))

如果您的字符串已经使用点作为小数分隔符,则无需进行替换


这个方法不会因为失去最后两个小数位而导致一个更大的数字吗? - tehfink
1
price_in_decimal = Decimal(price.replace(',','.')) 这应该是 @Nids 想要的。将逗号替换为句点。 - freerunner
@freerunner 没错! - Victor

4
在Python中有两种浮点数数据类型FloatDecimal。使用情况取决于您在程序中需要的小数精度。Float速度快,Decimal精确。
要将字符串转换为浮点数,请执行以下操作:
import decimal
float('1.2')
decimal.Decimal('1.2')

分析 FloatDecimal 对象

>>> import sys
>>> from decimal import Decimal

>>> num = '1.2'

>>> float(num)
1.2

>>> Decimal(num)
Decimal('1.2')


>>> # Precision
>>> float(1.2)
1.2

>>> Decimal(1.2)
Decimal('1.1999999999999999555910790149937383830547332763671875')


>>> # Memory usage
>>> sys.getsizeof(Decimal(num))
104

>>> sys.getsizeof(float(num))
24


>>> # Performance
>>> %timeit float(num)
140 ns ± 2.27 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

>>> %timeit Decimal(num)
192 ns ± 9.42 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

在您的情况下,您可以使用@Mark Byers的解决方案。

3

由于字符串中有额外的位,因此您需要使用strip()

A2 = [float(x.strip('"')) for x in A1]

4
你需要同时去掉额外的空格。 - DSM
2
使用 OP 的示例进行剪切和粘贴测试了吗?它不能直接运行。 - Mark Tolonen
@Mark,我不知道昨天我做了什么不同的事情,但现在它不起作用了。也许问题自从我复制它以来已经被编辑过了。 - Jake

2

在列表推导式中使用内置的float()函数。

A2 = [float(v.replace('"','').strip()) for v in A1]


1

A2 = [float(x.strip('"')) for x in A1] 这个可以用,@Jake,但是有一些不必要的0


2
无法与OP的“确切”示例一起使用。 零不是“不必要的”。 “float”无法在二进制中精确表示所有小数。 但请参见Mark Byers的答案。 - Mark Tolonen

0

有两种浮点数据类型,分别是FloatDecimal。根据您的程序需求来决定使用哪一种。 Decimal提供了高精度,比Float更加精确。

要将值字符串转换为浮点数,只需执行以下操作:

num = "29.0"
print (float(num))

将字符串转换为十进制数

from decimal import Decimal
num = "29.0"
print (Decimal(num))

针对您的具体问题,您可以使用以下代码。这两个代码对我都有效。

from decimal import Decimal
import re

result = [float(x.strip(' "')) for x in A1]
print(result)
#[29.0, 65.2, 75.2]


result = [Decimal(x.strip(' "')) for x in A1]
print(result)
#[Decimal('29.0'), Decimal('65.2'), Decimal('75.2')]


result = [float(re.search(r'\d+.\d+',number).group()) for number in A1]
print(result)
#[29.0, 65.2, 75.2]

result = [Decimal(re.search(r'\d+.\d+',number).group()) for number in A1]
print(result)
#[Decimal('29.0'), Decimal('65.2'), Decimal('75.2')]

-1

如果你正在将字符串转换为浮点数:

import re
A1 = [' "29.0" ',' "65.2" ',' "75.2" ']
float_values = [float(re.search(r'\d+.\d+',number).group()) for number in A1]
print(float_values)
>>> [29.0, 65.2, 75.2]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接