我有一本包含浮点数和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}
答案 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}