Поведение OrderdDict - PullRequest
       2

Поведение OrderdDict

0 голосов
/ 27 июня 2018

Я отвечал на один из вопросов о SO и наткнулся на такое поведение OrderedDict, которое я не смог объяснить. Идет следующим образом У вас есть диктант, который выглядит так:

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

Цель состоит в том, чтобы удалить записи словаря, в которых есть nan, что может быть выполнено следующими способами:

  1. При использовании for loop

    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 голосов
/ 27 июня 2018

Как упомянуто @timgeb, в версиях Python до 3.6 порядок словаря фактически случайный. Если вы все еще хотите использовать понимание в Python 3.5 и ниже, вы можете вместо этого использовать понимание списка кортежей:

OrderedDict([(k, v) for k, v in dict_cg.items() if not np.isnan(v[1])])
0 голосов
/ 27 июня 2018

Поскольку вы создаете обычный словарь с пониманием словаря, имеющий произвольный порядок, который вы передаете конструктору OrderedDict , затем .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...