【问题标题】:remove keys from dict based on value example nan [duplicate]根据值示例从字典中删除键 nan [重复]
【发布时间】:2022-01-26 05:49:03
【问题描述】:

如何删除字典中具有 nan 值的键?是否创建新字典?

示例:

my_dictionary = dict(
    first=float("nan"),
    second="second"
)

期待:

{'second': 'second'}
{k:v for k,v in my_dictionary.items() if not isnan(v)} 

不起作用,因为 isnan(v) 只接受数字作为参数

【问题讨论】:

标签: python dictionary


【解决方案1】:

也许您可以使用 NaN 不等于 NaN 的事实来使用 dict 理解:

out = {k:v for k,v in my_dictionary.items() if v==v}

或使用math.isnan:

out = {k:v for k,v in my_dictionary.items() if not isinstance(v, float) or not math.isnan(v)}

输出:

{'second': 'second'}

【讨论】:

    【解决方案2】:

    我提供了两种方式。

    第一种方法是使用条件值==值。有趣的是, NaN==NaN 返回 False (我知道这很混乱!)。我使用了这个 NaN 的特性。 (仅供参考,请参阅What is the rationale for all comparisons returning false for IEEE754 NaN values?

    第二种方法是检查值类型是否不是浮点数。即使它的类型是浮点数,它也会使用math 模块检查第二个条件天气是否为 NaN。我这里使用两个条件的原因是math.isnan()只能获取数字类型,否则会抛出异常。

    import math
    
    my_dictionary = dict(
        first=float("nan"),
        second="second"
    )
    print(my_dictionary)  # before
    #{'first': nan, 'second': 'second'}
    
    # Way 1
    my_dictionary = {k: v for k, v in my_dictionary.items() if v == v}
    
    # Way 2
    my_dictionary = {k: v for k, v in my_dictionary.items() if (not isinstance(v, float)) or (not math.isnan(v))}
    
    print(my_dictionary)  # after
    #{'second': 'second'}
    

    【讨论】:

      猜你喜欢
      • 2020-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-11
      • 1970-01-01
      • 1970-01-01
      • 2016-03-13
      相关资源
      最近更新 更多