2011-04-20 82 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