我正在回答SO上的一个问题,我偶然发现了这种OrderedDict
的行为,我无法解释。它如下 你有一个字典,看起来像这样:
exmpl = OrderedDict([(30, ('A1', 55.0)), (31, ('A2', 125.0)), (32, ('A3', 180.0)), (43, ('A4', float('nan')))])
目标是删除包含nan
的字典条目,这可以通过以下方式完成:
通过使用
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))])
通过字典理解方法(同时将其定义为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])])