2011-08-16 6 views
9

私は、基礎となる型が通常10進数で終わるネストされたデータ構造を扱うプログラムを持っています。例えばPythonのネストされたデータ構造の小数点以下切り上げ

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

は、このような変数を印刷するための簡単な神託の方法があるが、3DP(例えば)にすべての山車を四捨五入し、リストや辞書の特定の構成を想定していませんか?例えば

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

私は彼らがこの種の機能を持っていないと思う除いて、私は pformat(x,round=3)または多分

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

のようなものを考えています。基礎となるデータを永続的に丸めることは、もちろんオプションではありません。

+0

方法[Xにおいて(X * 1000)/1000.0階]のようなループを実行しているでしょうか? –

+0

は数字のリストに対してのみ機能します。 – acrophobia

答えて

4

これは、dicts、tuples、listsなどのフォーマット番号を再帰的に降りて、他のものだけを残します。

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) 

あなたがしようとフロートにすべてを変換したい場合は、代わりに、関数の最後の3行の

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 

ここでの問題は、我々は、私はそれが私がfor loopを使用している唯一の2レベルのリストのネストである知っていることから、Pythonでメソッドを平らに持っていないです。

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

名前で自分自身を参照しているラムダは間違っています。これは、名前付き関数またはy-コンビネータが意味するものです:)。彼はまた、タイプは「通常10進数で終わる」と言っていますので、時には浮動小数点型にならないこともあります。 – agf

+0

私はそれを 'round = lambda l:...'と 'def round(l):return ... 'を入れ替えるための練習として残しておきます:D – zeekay

+0

しかしy-コンビネータは素晴らしいですPythonでそれを使う理由は決してありません! – agf

関連する問題