2011-08-16 52 views
9

我有一個處理嵌套數據結構的程序,其中底層類型通常以十進制結尾。例如在Python中對嵌套數據結構中的小數進行舍入

x={'a':[1.05600000001,2.34581736481,[1.1111111112,9.999990111111]],...} 

有打印這樣一個變量的簡單Python的方式,但四捨五入所有彩車(說)3DP,而不是假設列表和字典的特定配置?例如

{'a':[1.056,2.346,[1.111,10.000],...} 

我想這樣 pformat(x,round=3)也許

pformat(x,conversions={'float':lambda x: "%.3g" % x}) 

除了我不認爲他們有這樣的功能。永久性取整基礎數據當然不是一種選擇。

+0

怎麼樣[在地板(X * 1000)/1000.0爲X]運行一個循環是怎樣的?僅適用於數字列表的 –

+0

。 – acrophobia

回答

4

這將遞歸地下降字符,元組,列表等,格式化數字和單獨留下其他東西。

import collections 
import numbers 
def pformat(thing, formatfunc): 
    if isinstance(thing, dict): 
     return type(thing)((key, pformat(value)) for key, value in thing.iteritems()) 
    if isinstance(thing, collections.Container): 
     return type(thing)(pformat(value) for value in thing) 
    if isinstance(thing, numbers.Number): 
     return formatfunc(thing) 
    return thing 

def formatfloat(thing): 
    return "%.3g" % float(thing) 

x={'a':[1.05600000001,2.34581736481,[8.1111111112,9.999990111111]], 
'b':[3.05600000001,4.34581736481,[5.1111111112,6.999990111111]]} 

print pformat(x, formatfloat) 

如果您想嘗試,一切都轉換爲浮動,你可以做

try: 
    return formatfunc(thing) 
except: 
    return thing 

,而不是最後三行的功能。

0
>>> b = [] 
>>> x={'a':[1.05600000001,2.34581736481,[1.1111111112,9.999990111111]]} 
>>> for i in x.get('a'): 
     if type(i) == type([]): 
      for y in i: 
       print("%0.3f"%(float(y))) 
     else: 
      print("%0.3f"%(float(i))) 


    1.056 
    2.346 
    1.111 
    10.000 

這裏的問題是我們沒有拼合方法蟒蛇,因爲我知道,這只是2級列表嵌套我已經使用for loop

1

一個簡單的方法假設你有花車的列表:

>>> round = lambda l: [float('%.3g' % e) if type(e) != list else round(e) for e in l] 
>>> print {k:round(v) for k,v in x.iteritems()} 
{'a': [1.06, 2.35, [1.11, 10.0]]} 
+0

通過名稱引用自己的lambda是錯誤的,這就是命名函數或y-combinator的用途:)。他還說這種類型「通常最終是十進制」,所以我認爲它們有時不會是「浮動」的。 – agf

+0

我將它作爲練習給讀者交換'round = lambda l:...''def round(l):return ...':D – zeekay

+0

但是y-combinator非常棒,從來沒有理由在Python中使用它! – agf

相關問題