2017-02-20 11 views
0

我有一個字符串,它是這樣Python如何評估精度到十進制列表的字符串?

list_str = '[148654.08425925925, 148656.99994212962, 148658.08229166668, 148661.0020601852]' 

然後我用列表的eval()將其轉換爲真正的列表對象在Python

print eval(list_str) 

但是,輸出是圓的,我不要」想要

0 = {float} 148654.084259 
1 = {float} 148656.999942 
2 = {float} 148658.082292 
3 = {float} 148661.00206 

我怎樣才能讓它保持值在字符串(精度十進制)?

我需要使用eval(),因爲它會使用這個列表中的其他操作以及

+2

永遠不要命名變量像'list'等等......現在你不能在那個語句之後調用'list(..)'。 –

+0

此外,我們正在談論python-2.x或python-3.x? –

+0

這是一個例子,讓你的想法,無論如何。 –

回答

0

使用Python中十進制

from decimal import * 
mlist = '[148654.08425925925, 148656.99994212962, 148658.08229166668, 148661.0020601852]' 
mlisttrim = mlist[1:-1] 
l = [] 
for i in mlisttrim.split(', '): 
    l.append(Decimal(i)) 
print l 
+0

我需要使用eval(),因爲它也會在此列表上使用其他操作。 –

+1

@BằngRikimaru,除非你非常確定你需要,否則不要使用'eval()'。它可以運行任意代碼。你幾乎不需要它。改爲使用['ast.literal_eval()'](https://docs.python.org/3/library/ast.html?highlight=ast.literal_eval#ast.literal_eval)。 – Chris

+0

@Chris是的,它可以改變任何東西,我有同樣的想法,但我需要先用小數解決這個問題,謝謝。 –

0

floats用二進制小數表示,並有損失在轉換爲和正在使用的點分十進制表示法(see here)時的精度。 python decimal package實現了十進制浮點運算,並沒有這個限制。

您不能使用eval來分解列表,因爲這些值將評估爲浮點數,但您可以使用正則表達式包提取浮點數並從此處構建列表。

>>> import decimal 
>>> import re 
>>> list_str = '[148654.08425925925, 148656.99994212962, 148658.08229166668, 148661.0020601852]' 
>>> items = [decimal.Decimal(x) for x in re.findall(r'\d+\.?\d*', list_str)] 
>>> items 
[Decimal('148654.08425925925'), Decimal('148656.99994212962'), Decimal('148658.08229166668'), Decimal('148661.0020601852')] 
>>> 
+0

似乎我沒有其他想法,謝謝你的有用評論。 –

1

雖然可以在浮點精度的損失,沒有精度損失這裏,因爲它看起來就像是從彩車開始用Python列表生成的字符串。需要注意的是ast.literal_eval建議在eval,但是:

>>> list_str = '[148654.08425925925, 148656.99994212962, 148658.08229166668, 148661.0020601852]' 
>>> import ast 
>>> L = ast.literal_eval(list_str) 
>>> L 
[148654.08425925925, 148656.99994212962, 148658.08229166668, 148661.0020601852] 

注意上面的完全原始的字符串相匹配。然而,打印個人花車爲小數點後相對於整個列表默認爲六位數字,所以如果你想更精確,指定它:

>>> for f in L: 
...  print '{:.11f}'.format(f) 
...  
148654.08425925925 
148656.99994212962 
148658.08229166668 
148661.00206018519 

我還建議尋找到picklejson模塊保存列表首先要避免使用eval甚至ast.literal_eval