Круглый список элементов Python, каждый с разным десятичным знаком - PullRequest
0 голосов
/ 01 февраля 2019

Я использую Python 3.6.4

У меня есть класс, в котором я вычисляю кучу атрибутов.Я должен округлить все это до различных десятичных разрядов, и некоторые из них могут быть Нет.

Пример:

Предположим, у меня есть следующие атрибуты, значения, десятичные разряды

a, 1.155 , 0
b, 1.123 , 2
c, None  , 1
...

в результате мне нужно получить

a= 1.2
b= 1.23
c= None
...

Тривиальное решение

Я иду для каждого атрибута и округляю его как

if attribute is not None:
    attribute = round(attribute, decimal_places)

но у меня слишком много атрибутов.

То, что я пробовал:

Я составил список кортежей (attribute, decimal_places).Например:

attributes_decimal_places =  [
            (self.a, 0),
            (self.b, 2),
            (self.c, 1),
]

В этом списке я могу запустить следующую команду, которая дает мне правильные округленные значения, но я не могу сохранить значения этого результата в атрибутах

solution = [round(x[0], x[1]) if isinstance(x[0], float) else x[0] for x in attributes_decimal_points]

Вопрос:

Как получить округленные значения в атрибутах, а не в списке?

Решение:

Спасибовсем, кто ответил.Решение, которое отлично работает для меня:

    attributes_decimal_points = [
        (self.a, "a", 1),
        (self.b, "b", 2),
        (self.c, "c", 3)
    ]

    for attribute in attributes_decimal_points:
        if attribute[0] is None:
            continue
        else:
            setattr(self, attribute[1], round(attribute[0], attribute[2])) 

1 Ответ

0 голосов
/ 01 февраля 2019

Вы можете использовать словарь:

    solution = {}
    for x in attributes_decimal_points:
        if isinstance(x[0], float):
            solution.update({x[0]: round(x[0], x[1])})
        else:
            solution.update({x[0]: x[1]})

Таким образом, вы можете получить атрибуты по их именам.

...