본문 바로가기

개발하자

Python에서 중첩된 데이터 구조의 소수점 반올림

반응형

Python에서 중첩된 데이터 구조의 소수점 반올림

나는 기본 유형이 일반적으로 10진수로 끝나는 중첩된 데이터 구조를 다루는 프로그램이 있다.

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

그러한 변수를 인쇄하지만 모든 플로트를 (예를 들어) 3dp로 반올림하고 목록과 사전의 특정 구성을 가정하지 않는 간단한 파이토닉 방법이 있는가.

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

내가 생각하는 것은 아마도

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

하지만 이런 기능은 없는 것 같아요. 기본 데이터를 영구적으로 반올림하는 것은 물론 옵션이 아닙니다.




>>> 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레벨 리스트 네스팅뿐이라는 것을 알기 때문입니다.




이렇게 하면 숫자 형식을 지정하고 다른 항목은 그대로 둔 채 딕트, 튜플, 목록 등이 반복적으로 감소합니다.

import collections.abc
import numbers

def pformat(thing, formatfunc):
    if isinstance(thing, dict):
        return type(thing)((key, pformat(value, formatfunc)) for key, value in thing.items())
    if isinstance(thing, collections.abc.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))

만약 당신이 모든 것을 플로트로 변환하고 싶다면, 당신은 할 수 있다

try:
    return formatfunc(thing)
except Exception:
    return thing

함수의 마지막 세 줄 대신에.




플로트 목록이 있다고 가정하는 간단한 접근법:

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

반응형