2011-08-16 1 views
9

기본 유형이 일반적으로 10 진수로 끝나는 중첩 데이터 구조를 다루는 프로그램이 있습니다. 예 :파이썬에서 중첩 된 데이터 구조의 소수 자릿수 반올림

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

등의 변수를 인쇄하는 간단한 파이썬 방법이 있나요하지만 반올림 모두가 (말) 3DP하지가 목록과 사전의 특정 구성을 가정하는 수레? 예 :

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

나는 그들이 이런 종류의 기능을 생각하지 않는다 pformat(x,round=3) 또는 I를 제외하고 어쩌면

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

같은 것을 생각하고 있어요. 기본 데이터를 영구적으로 반올림하는 것은 물론 불가능합니다.

+0

방법 [A에서 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) 

당신이 시도하고 float로 모든 것을 변환 할 경우 대신 함수의 마지막 세 줄의

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 수준 목록 중첩 알고 있기 때문에, 파이썬에서 방법을 평평하지 않아도됩니다.

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 진수로 끝나는"유형이라고 말했기 때문에 때로는 'float'할 수 없을 것이라고 생각합니다. – agf

+0

나는'round = lambda l : ...'을'def round (l) : return ... '으로 바꾸기 위해 독자에게 연습 문제로 남겨 둘 것이다 : D – zeekay

+0

그러나 y-combinator는 굉장하고 거기있다 파이썬에서 사용할 이유가 없습니다! – agf