Круглые плавающие слова во вложенном словаре рекурсивно - PullRequest
0 голосов
/ 08 мая 2019

Я пытаюсь округлить значения с плавающей точкой во вложенном словаре, который также имеет другие значения.Я посмотрел на этот поток - Округление десятичных знаков во вложенных структурах данных в Python

Пытаясь реализовать такую ​​функцию:

import collections
import numbers

def formatfloat(x):
    return "%.3g" % float(x)

def pformat(dictionary, function):
    if isinstance(dictionary, dict):
        return type(dictionary)((key, pformat(value)) for key, value in dictionary.items())
    if isinstance(dictionary, collections.Container):
        return type(dictionary)(pformat(value) for value in dictionary)
    if isinstance(dictionary, numbers.Number):
        return formatfunc(dictionary)
    return dictionary

x={'a':[1.05600000001,2.34581736481,[8.1111111112,9.999990111111]], 
   'b':[3.05600000001,4.34581736481,[5.1111111112,6.999990111111]]}

pformat(x, formatfloat)

Я получаю эту ошибку:

TypeError: pformat() missing 1 required positional argument: 'function'

Ответ был помечен как правильный, поэтому мне было интересно, нужно ли мне что-то менять.Это именно то, что я ищу для своего словаря.Любая помощь приветствуется!

Ответы [ 3 ]

2 голосов
/ 08 мая 2019

Вам необходимо добавить параметр после pformat:

До

pformat(value))

После:

pformat(value, function))

, затем изменить ошибку опечатки: formatfunc на функцию

Это рабочий код:

import collections
import numbers

def formatfloat(x):
    return "%.3g" % float(x)

def pformat(dictionary, function):
    if isinstance(dictionary, dict):
        return type(dictionary)((key, pformat(value, function)) for key, value in dictionary.items())
    if isinstance(dictionary, collections.Container):
        return type(dictionary)(pformat(value, function) for value in dictionary)
    if isinstance(dictionary, numbers.Number):
        return function(dictionary)
    return dictionary

x={'a':[1.05600000001,2.34581736481,[8.1111111112,9.999990111111]], 
   'b':[3.05600000001,4.34581736481,[5.1111111112,6.999990111111]]}

pformat(x, formatfloat)

Результат:

{'a': ['1.06', '2.35', ['8.11', '10']], 'b': ['3.06', '4.35', ['5.11', '7']]}
2 голосов
/ 08 мая 2019

Я написал это немного по-другому:

x={'a':[1.05600000001,2.34581736481,[8.1111111112,9.999990111111]], 
   'b':[3.05600000001,4.34581736481,[5.1111111112,6.999990111111]]}


def recursive_rounding(keys, values):
    to_return = {}
    for key, value in zip(keys, values):
        print key, value
        if isinstance(value, dict):
            rounded_value = recursive_rounding(value.keys(), value.values())
        elif isinstance(value, (tuple, list)):
            rounded_value = [round_by_type(x) for x in value]
        else:
            rounded_value = round_by_type(value)
        print key, value
        to_return[round_by_type(key)] = rounded_value
    return to_return

def round_by_type(to_round):
    if isinstance(to_round, (int, float)):
        return round(to_round, 2)
    elif isinstance(to_round, (list, tuple)):
        return [round_by_type(x) for x in to_round]
    return to_round

recursive_rounding(x.keys(), x.values())

Я написал это очень быстро, его можно немного почистить и улучшить, но просто чтобы показать, как вы можете подойти к нему с другой точки зрения

ВЫХОД IS:

# Result: {'a': [1.06, 2.35, [8.11, 10.0]], 'b': [3.06, 4.35, [5.11, 7.0]]} # 
2 голосов
/ 08 мая 2019

Здесь только синтаксические ошибки внутри.

Вы вызываете функцию pformat внутри без необходимых аргументов.Вы передаете только значение и не передаете функцию

return type(dictionary)((key, pformat(value)) for key, value in dictionary.items())

И в последнем if выражении вы вызываете не реализованную функцию formatfunc.Возможно, это опечатка, и вам нужно вызвать функцию formatfloat.

Если исправить это, результат:

{'a': ['1.06', '2.35', ['8.11', '10']], 'b': ['3.06', '4.35', ['5.11', '7']]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...