Behavior of OrderdDict



我正在回答SO上的一个问题,我偶然发现了这种OrderedDict的行为,我无法解释。它如下 你有一个字典,看起来像这样:

exmpl  = OrderedDict([(30, ('A1', 55.0)), (31, ('A2', 125.0)), (32, ('A3', 180.0)), (43, ('A4', float('nan')))])

目标是删除包含nan的字典条目,这可以通过以下方式完成:

  1. 通过使用for回路

    for k,v in dict_cg.items():
    if np.isnan(v[1]):
    exmpl.pop(k)
    print exmpl
    

    输出将是

    OrderedDict([(30, ('A1', 55.0)), (31, ('A2', 125.0)), (32, ('A3', 180.0))])
    
  2. 通过字典理解方法(同时将其定义为OrderedDict(,如下所示

    exmpl = OrderedDict({k:v for k, v in dict_cg.items() if not np.isnan(v[1])})
    print exmpl
    

返回

OrderedDict([(32, ('A3', 180.0)), (30, ('A1', 55.0)), (31, ('A2', 125.0))])

有人可以教育我,为什么字典在第二种情况下混乱,结果混乱。?

因为您正在创建一个具有字典推导式的普通字典,该字典推导具有任意顺序,然后传递给OrderedDict构造函数。

就像@timgeb提到的,在 3.6 之前的 Python 版本中,字典顺序实际上是随机的。如果你想在 Python 3.5 及更低版本中仍然使用推导式,你可以改用元组的列表推导式:

OrderedDict([(k, v) for k, v in dict_cg.items() if not np.isnan(v[1])])

最新更新