Понимание Dict с использованием isinstance для значений типа float и int - PullRequest
0 голосов
/ 03 мая 2019

У меня есть словарь со значениями типа float и int, я пытаюсь использовать dict-понимание для кодирования обоих.Как я могу включить isinstance (попытки .params [i], float) и isinstance (попытки .params [i], int), чтобы я мог получить правильные значения?

попытки.1003 *

[name: "p1"
float_value: 0.93712629656
, name: "p2"
int_value: 7
, name: "p3"
float_value: 0.293585904040
, name: "p4"
int_value: 6
, name: "p5"
int_value: 7]





{attempts.params[i].name.encode('ascii','ignore'):attempts.params[i].float_value for i in range(len(attempts.params))}

Вывод:

{'p1': 0.93712629656,
'p2': 0.0,
'p3': 0.293585904040,
'p4': 0.0,
'p5': 0.0}

Как видите, p2, p4 и p5 являются значениями типа int, поэтому они не выводятся правильно.

Я пытался:

{attempts.params[i].name.encode('ascii','ignore'):attempts.params[i].float_value for i in range(len(attempts.params)) if isinstance(attempts.params[i], float)}

, но получил пустой диктант {}

Желаемый результат:

{'p1': 0.93712629656,
'p2': 7,
'p3': 0.293585904040,
'p4': 10,
'p5': 5}

Ответы [ 2 ]

1 голос
/ 03 мая 2019

attempts.params[i] не является int или a float, в зависимости от имеющихся у него атрибутов. Вместо этого он может иметь int -значный атрибут или float -значный атрибут; isinstance не скажу вам, что.

Вместо этого просто попробуйте получить значение int_value; если это не удалось, получите значение float_value; и если , что не удалось, просто используйте None.

Кроме того, не перебирайте предполагаемые индексы attempts.params; просто переберите сами элементы.

{x.name.encode('ascii', 'ignore'): 
   getattr(x, 
           'int_value',
           getattr(x,
                   'float_value',
                    None))
   for x in attempts.params}
0 голосов
/ 04 мая 2019

Вот исправленная версия вашего списка (я обновлю свой ответ, если вы обновите свой ввод):

params = [
    {"name": "p1", "float_value": 0.93712629656},
    {"name": "p2", "int_value": 7},
    {"name": "p3", "float_value": 0.293585904040},
    {"name": "p4", "int_value": 6},
    {"name": "p5", "int_value": 7}
]

Чтобы извлечь значение из параметра, вы должны проверить существование float_value введите DICT:

def get_value(param): 
    return param["float_value"] if "float_value" in param else param["int_value"]

Сейчас:

print({param["name"].encode('ascii','ignore'): get_value(param) for param in params})

Имеет ожидаемый результат:

{b'p1': 0.93712629656, b'p2': 7, b'p3': 0.29358590404, b'p4': 6, b'p5': 7}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...