Как изменить порядок ключей в словаре Python 3.5, используя другой список в качестве ссылки для ключей? - PullRequest
0 голосов
/ 02 сентября 2018

Я пытаюсь изменить порядок «ключей» в словаре, но безуспешно. Это мой первоначальный словарь:

Not_Ordered={
  'item':'book',
  'pages':200, 
  'weight':1.0, 
  'price':25, 
  'city':'London'
}

Есть ли у меня возможность изменить порядок в соответствии со списком ключей, например:

key_order=['city', 'pages', 'item', 'weight', 'price']

Примечание:

  • Я использую Python 3.5.2.
  • Я не ищу сортировку ключей.
  • Я знаю, что Python 3.6 следует за вставкой.
  • Кроме того, я знаю о OrderedDict, но он дает мне список, но я ищу словарь как конечный результат.

Ответы [ 4 ]

0 голосов
/ 18 ноября 2018

вы все равно можете использовать сортировку и указать элементы ().

ordered_dict_items = sorted(Not_Ordered.items(), key=lambda x: key_order.index(x[0]))  
return dict((x, y) for x, y in ordered_dict_items) # to convert tuples to dict

или напрямую используя списки:

ordered_dict_items = [(k, Not_Ordered[k]) for k in key_order]
return dict((x, y) for x, y in ordered_dict_items) # to convert tuples to 
0 голосов
/ 02 сентября 2018

Dicts "официально" поддерживаются в порядке вставки, начиная с 3.7. Они были так заказаны в 3.6, но до 3.7 это не было гарантировано. До версии 3.6 вы ничего не можете сделать, чтобы повлиять на порядок появления ключей.

Но вместо этого можно использовать OrderedDict. Я не понимаю ваше возражение "но оно дает мне список" - я не вижу никакого смысла, в котором это действительно так.

Ваш пример:

>>> from collections import OrderedDict
>>> d = OrderedDict([('item', 'book'), ('pages', 200),
...                  ('weight', 1.0), ('price', 25),
...                  ('city', 'London')])
>>> d # keeps the insertion order
OrderedDict([('item', 'book'), ('pages', 200), ('weight', 1.0), ('price', 25), ('city', 'London')])
>>> key_order= ['city', 'pages', 'item', 'weight', 'price'] # the order you want
>>> for k in key_order: # a loop to force the order you want
...     d.move_to_end(k)
>>> d # which works fine
OrderedDict([('city', 'London'), ('pages', 200), ('item', 'book'), ('weight', 1.0), ('price', 25)])

Не смущайтесь форматом вывода! d - это , отображаемый в виде списка пар, переданный конструктору OrderedDict, для ясности. d сам по себе не является списком.

0 голосов
/ 02 сентября 2018

нет решения в Python 3.5


для питона> = 3,6, просто

k = {k : Not_Ordered[k] for k in key_order}
0 голосов
/ 02 сентября 2018

Ваша проблема здесь в том, что словари в Python не имеют порядка вставки, поэтому вы не можете "упорядочить" их. Как вы можете видеть здесь: Официальные документы Python по словарям . Если вы дадите больше информации о том, какова цель этого, мы можем попытаться решить ее другим способом.

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