使用isinstance作为float和int键值的Dict理解

时间:2019-05-03 17:11:09

标签: python dictionary dictionary-comprehension

我有一本包含浮点数和int值的字典,我正在尝试使用dict理解来对两者进行编码。如何合并一个isinstance(attempts.params [i],float)和isinstance(attempts.params [i],int),以便获得正确的值?

attempts.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]





{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 个答案:

答案 0 :(得分:1)

根据其属性,

attempts.params[i]不是int 不是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}

答案 1 :(得分:0)

这是您列表的固定版本(如果您更新输入内容,我会更新答案):

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键是否存在:

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}