개발하자
Python에서 중첩된 데이터 구조의 소수점 반올림
Cuire
2023. 3. 11. 02:10
반응형
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]]}
반응형