2011-04-20 87 views
1

什么是简单的方法来蜇转换成数学运算:从
字符串转换为数字

['3.65e+03', '1.14e+04', '1.35e+04', '1.46e+04'] 

到:

[3.65e+03, 1.14e+04, 1.35e+04, 1.46e+04] 

感谢。

回答

4

首先,我希望您知道limitations在我们当前的体系结构中精确地表示浮点数。

转换的简单方法就是这样。

>>> s = ['3.65e+03', '1.14e+04', '1.35e+04', '1.46e+04'] 
>>> map(float,s) 
>>> [3650.0, 11400.0, 13500.0, 14600.0] 

但是float将它们舍入到最接近的值,只要值相同,它的表示就无关紧要。有时,这些值可以具有几乎相同的值,几乎相同的值,例如,

>>> s = ['3.65e+93', '1.14e+04', '1.35e+04', '1.46e+04'] 
>>> map(float,s) 
[3.6500000000000001e+93, 11400.0, 13500.0, 14600.0] 

更新 - 请参阅John Machin对此行为的评论/ repr。

但是,如果你想确切的表示,例如,如果您正在处理涉及金钱的计算,那么您可能需要使用Decimal类型而不是浮点数,这对于所有用途而言可以与浮点数相同。

>>> from decimal import Decimal 
>>> map(Decimal,s) 
[Decimal('3.65E+93'), Decimal('1.14E+4'), Decimal('1.35E+4'), Decimal('1.46E+4')] 
+0

+1使用十进制 – lecodesportif 2011-04-20 22:18:10

+0

-1您很困惑:'float()'总是舍入到最接近的float值,如果有必要的话。 “如你所见”??你的第一个map()输出中没有ROUNDOFF。在你的第二部分中,'3.6500000000000001e + 93'仅仅是你使用2.7以前版本Python的工具,其中'repr()'总是使用17位精度的十进制数字。 Python 2.7生成'3.65e + 93'。在任何Python中,'3.6500000000000001e + 93 == 3.65e + 93'都是真的。引入具有其自身有限精度的“小数”是非常不稳固的理由。 – 2011-04-20 22:30:22

+0

约翰 - 感谢您的解释和纠正。我在我的答案中更新了几个部分。至于Decimal的精度,它可以用'getcontext()来控制。prec = n'不是吗? – 2011-04-20 23:09:22

4
map(float, your_list) 

[float(x) for x in your_list] 

更新对于为什么不合格的建议“使用十进制”的解释是不是一个好主意,看到my answer to another question

+0

对于列表理解+1(通常在Python中更常见),并且在需要时允许使用if语句。顺便说一句,你打算链接到[这个答案](http://stackoverflow.com/questions/5683869/why-does-str-round-up-floats/5696968#5696968)? – 2011-04-21 02:51:24

+0

@benhoyt:谢谢;链接现已修复。 – 2011-04-21 08:56:28

0
numbers = [eval(s) for s in ['3.65e+03', '1.14e+04', '1.35e+04', '1.46e+04']] 

EVAL是一个黑客攻击的一位,但它很好保证工作。 (特定的浮点数也是一种好的方法。)

+0

-1:假定字符串来自外部来源(命令行,文件,网络等)。盲目使用''eval()''是一个巨大的风险,因为它允许任意代码被执行。甚至为了降低这种安全风险,为什么要在内置的专门为此设计的float()函数中使用''eval()''? – Blair 2011-04-21 09:47:31