【问题标题】:Dict Comprehension using isinstance for float and int key values使用 isinstance 对 float 和 int 键值进行字典理解
【发布时间】:2019-05-03 17:11:09
【问题描述】:

我有一本包含浮点数和整数值的字典,我正在尝试使用 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}

【问题讨论】:

  • 输出很好,但输入在哪里?
  • 究竟是什么 attempts.params[i]?如果它具有int_value 和/或float_value 属性,则它不是int float
  • 模 1 检查怎么样? if x % 1 == 0 表示您有一个int
  • 可能类似于{x.name.encode('ascii', 'ignore'): x.float_value if hasattr(x, 'float_value') else x.int_value for x in attempts.params}
  • 您的“列表”不是有效的 Python 表达式。

标签: python dictionary dictionary-comprehension


【解决方案1】:

attempts.params[i] 不是 int float,基于它的属性。相反,它可能具有int-valued 属性或float-valued 属性; isinstance 不会告诉你是哪个。

相反,只是尝试获取int_value 的值;如果失败,获取float_value 的值;如果 that 失败,只需使用None

另外,不要迭代attempts.params 的假定索引;只需遍历项目本身。

{x.name.encode('ascii', 'ignore'): 
   getattr(x, 
           'int_value',
           getattr(x,
                   'float_value',
                    None))
   for x in attempts.params}

【讨论】:

  • 我得到这个:{'p1': 0L, 'p2': 7L, 'p3': 0L, 'p4': 6L, 'p5': 7L}
【解决方案2】:

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

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}
]

要从参数中提取值,您必须测试 dict 中是否存在 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}

【讨论】:

    猜你喜欢
    • 2017-12-16
    • 2021-06-02
    • 2011-07-08
    • 1970-01-01
    • 1970-01-01
    • 2019-08-06
    • 1970-01-01
    • 2021-10-31
    • 2018-12-22
    相关资源
    最近更新 更多