OrderedDict的行为

时间:2018-06-27 12:20:23

标签: python dictionary

我正在回答关于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))])

有人能教育我,为什么第二种情况下的字典混乱变成混乱??

2 个答案:

答案 0 :(得分:4)

因为您要创建具有字典理解能力的普通字典,字典具有任意顺序,因此您可以将其传递给java -jar target/test-SNAPSHOT.jar "$(realpath "$1")" "$(realpath "$2")" 构造函数

答案 1 :(得分:2)

就像@timgeb提到的那样,在3.6之前的Python版本中,字典顺序实际上是随机的。如果您仍想在Python 3.5及以下版本中使用理解,则可以使用元组的列表理解:

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