2011-08-16 12 views
9

Mam program, który zajmuje się zagnieżdżonymi strukturami danych, w których typ bazowy zwykle kończy się na wartościach dziesiętnych. na przykładZaokrąglanie liczb dziesiętnych w zagnieżdżonych strukturach danych w języku Python

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

Czy istnieje prosty sposób wydrukować pythonic taką zmienną, ale zaokrąglenie wszystkich pływaków do (powiedzmy) 3DP i nie zakładając konkretną konfigurację list i słowników? na przykład

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

myślę coś pformat(x,round=3) czy może

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

wyjątkiem nie sądzę, że mają tego rodzaju funkcjonalności. Trwale zaokrąglanie podstawowych danych nie jest oczywiście opcją.

+0

jak o prowadzeniu pętlę jak [piętrze (x * 1000) /1000.0 dla xw a]? –

+0

, który działa tylko w przypadku list liczb. – acrophobia

Odpowiedz

4

Spowoduje to rekurencyjne zejście do dykt, krotek, list itp. Formatowanie liczb i pozostawianie innych rzeczy w spokoju.

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) 

Jeśli chcesz spróbować i przekonwertować wszystko do pływaka, można zrobić

try: 
    return formatfunc(thing) 
except: 
    return thing 

zamiast trzech ostatnich wierszach funkcji.

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 

Problem Oto nie mamy spłaszczyć metodę w Pythonie, ponieważ wiem, że to jest tylko lista gniazdowania 2 poziom Użyłem for loop.

1

Proste podejście zakładając, że masz list pływaków:

>>> 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 odnosząc się do siebie po imieniu jest po prostu błędna, to właśnie nazywa się funkcje lub y-kombinator :). Powiedział również, że typ "zwykle kończy się na dziesiętnym", więc myślę, że czasami nie będą one "pływalne". – agf

+0

Zostawię to jako ćwiczenie dla czytelnika, aby zamienić 'round = lambda l: ...' z 'def round (l): return ...': D – zeekay

+0

Ale y-combinator jest niesamowity i jest nigdy nie ma powodu, aby używać go w Pythonie! – agf

Powiązane problemy