Rounding decimals in nested data structures in Python
This will recursively descend dicts, tuples, lists, etc. formatting numbers and leaving other stuff alone.
import collections
import numbers
def pformat(thing, formatfunc):
if isinstance(thing, dict):
return type(thing)((key, pformat(value, formatfunc)) for key, value in thing.iteritems())
if isinstance(thing, collections.Container):
return type(thing)(pformat(value, formatfunc) 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)
If you want to try and convert everything to a float, you can do
try:
return formatfunc(thing)
except:
return thing
instead of the last three lines of the function.