摆脱NaN作为python字典中的关键

时间:2017-11-14 11:04:10

标签: python dictionary filter nan

我有一个字典,其中一个键是NaN,我想删除键及其对应的值。我试过这个:

from math import isnan

clean_dict = filter(lambda k: not isnan(k), dict_HMDB_ID)

但clean_dict不是字典。我想从python输出它,但我得到''

2 个答案:

答案 0 :(得分:2)

filter没有返回字典。它返回Python 2中的列表和Python 3中的过滤器对象。

您可以使用dict.pop

d = {'a': 1, 'b': 2}
print(d)
# {'a': 1, 'b': 2}
d.pop('b')
print(d)
# {'a': 1}

在您的具体情况下,

dict_HMDB_ID.pop(float('NaN'))

为了完整起见。 可以完成字典理解,但迭代没有意义,因为无论如何键都是唯一的

clean_dict = {k: v for k, v in dict_HMDB_ID.items() if not math.isnan(k)}


如果你坚持在这里使用filter(你真的不应该),你将需要:

  1. 传递dict_HMDB_ID.items(),以便保留原始值
  2. 提供自定义功能,因为它现在将在(key, value)元组上运行。
  3. 将返回的过滤器对象(它将包含带有(key, value)元组的迭代器)转换回字典

  4. import math
    
    dict_HMDB_ID = {1: 'a', float('Nan'): 'b'}
    clean_dict = dict(filter(lambda tup: not math.isnan(tup[0]), dict_HMDB_ID.items()))
    print(clean_dict)
    # {1: 'a'}
    

    我应该提一下,第一种方法(.pop)直接修改dict_HMDB_ID,而另外两种方法创建一个新字典。如果您希望使用.pop 创建新词典(保留dict_HMDB_ID),可以使用dict创建新词典:

    d = {'a': 1, 'b': 2}
    new_d = dict(d)
    new_d.pop('b')
    print(d)
    # {'b': 2, 'a': 1}
    print(new_d)
    # {'a': 1}
    

答案 1 :(得分:-1)

你可以这样做:

from math import nan
dict_HMDB_ID.pop(nan)
clean_dict = dict_HMDB_ID

或者如果您想保留dict_HMDB_ID

,则相反
from math import nan
clean_dict = dict(dict_HMDB_ID)
clean_dict.pop(nan)