Как сохранить ключи/значения в том же порядке, как объявлено?

У меня есть словарь, который я объявил в определенном порядке, и я хочу постоянно держать его в этом порядке. Ключи/значения не могут быть сохранены в порядке, основанном на их значении, я просто хочу их в том порядке, в котором я их объявил.

Так что, если у меня есть словарь:

d = {'ac': 33, 'gw': 20, 'ap': 102, 'za': 321, 'bs': 10}

Это не в том порядке, если я его просматриваю или перебираю, есть ли способ убедиться, что Python сохранит явный порядок, в котором я объявил ключи/значения?

Ответ 1

from collections import OrderedDict
OrderedDict((word, True) for word in words)

содержит

OrderedDict([('He', True), ('will', True), ('be', True), ('the', True), ('winner', True)])

Если значения True (или любой другой неизменяемый объект), вы также можете использовать:

OrderedDict.fromkeys(words, True)

Ответ 2

Вместо объяснения теоретической части приведу простой пример.

>>> from collections import OrderedDict
>>> my_dictionary=OrderedDict()
>>> my_dictionary['foo']=3
>>> my_dictionary['aol']=1
>>> my_dictionary
OrderedDict([('foo', 3), ('aol', 1)])
>>> dict(my_dictionary)
{'foo': 3, 'aol': 1}

Ответ 3

Начиная с Python 3.6 и далее стандартный тип dict поддерживает порядок вставки по умолчанию.

определяющий

d = {'ac':33, 'gw':20, 'ap':102, 'za':321, 'bs':10}

приведет к появлению словаря с ключами в порядке, указанном в исходном коде.

Это было достигнуто путем использования простого массива с целыми числами для разреженной хеш-таблицы, где эти целые числа индексируют в другой массив, в котором хранятся пары ключ-значение (плюс вычисленный хеш). Этот последний массив просто хранит элементы в порядке вставки, и вся комбинация фактически использует меньше памяти, чем реализация, используемая в Python 3.5 и ранее. Смотрите оригинальную идею идеи Раймонда Хеттингера для деталей.

В 3.6 это все еще считалось деталью реализации; посмотрите документацию Что нового в Python 3.6:

Сохраняющий порядок аспект этой новой реализации считается деталью реализации, и на него не следует полагаться (это может измениться в будущем, но желательно иметь эту новую реализацию dict в языке в течение нескольких выпусков, прежде чем изменять спецификацию языка. предписывать семантику сохранения порядка для всех текущих и будущих реализаций Python, что также помогает сохранить обратную совместимость со старыми версиями языка, где все еще действует случайный порядок итераций, например, Python 3.5).

Python 3.7 переводит эту деталь реализации в спецификацию языка, поэтому теперь обязательно, чтобы dict сохранял порядок во всех реализациях Python, совместимых с этой версией или более новой. Смотрите выражение BDFL.

В некоторых случаях вы все еще можете использовать класс collections.OrderedDict(), поскольку он предлагает некоторые дополнительные функции поверх стандартного типа dict. Например, быть обратимым (это распространяется на объекты вида) и поддерживать переупорядочение (с помощью move_to_end()).

Ответ 4

Обратите внимание, что этот ответ относится к версиям Python до Python3.7. CPython 3.6 поддерживает порядок вставки в большинстве случаев в качестве детали реализации. Начиная с Python3.7, было объявлено, что реализации ДОЛЖНЫ поддерживать порядок вставки, чтобы быть совместимыми.


Словари Python неупорядочены. Если вы хотите упорядоченный словарь, попробуйте collection.OrderedDict.

Обратите внимание, что OrderedDict был введен в стандартную библиотеку в python 2.7. Если у вас более старая версия python, вы можете найти рецепты для упорядоченных словарей в ActiveState.

Ответ 5

Словари будут использовать порядок, который делает поиск эффективным, и вы не можете изменить его,

Вы можете просто использовать список объектов (2 элемента кортежа в простом случае или даже класс) и добавить элементы в конец. Затем вы можете использовать линейный поиск для поиска элементов в нем.

В качестве альтернативы вы можете создать или использовать другую структуру данных, созданную с целью поддержания порядка.

Ответ 6

Я столкнулся с этим сообщением, пытаясь выяснить, как заставить OrderedDict работать. PyDev для Eclipse вообще не смог найти OrderedDict, поэтому я решил сделать кортеж значений словарного ключа, поскольку я бы хотел, чтобы они были заказаны. Когда мне нужно было вывести свой список, я просто повторил значения кортежей и включил итерированный "ключ" из кортежа в словарь, чтобы получить мои значения в том порядке, в котором они мне нужны.

Пример:

test_dict = dict( val1 = "hi", val2 = "bye", val3 = "huh?", val4 = "what....")
test_tuple = ( 'val1', 'val2', 'val3', 'val4')
for key in test_tuple: print(test_dict[key])

Это немного громоздко, но я нажимаю на время, и это обходное решение, с которым я придумал.

note: список подходов к списку, который предложил кто-то другой, для меня действительно не имеет смысла, потому что списки упорядочены и индексируются (а также отличаются от словарей).

Ответ 7

Вы не можете делать то, что хотите, со словарем. У вас уже есть словарь d = {'ac':33, 'gw':20, 'ap':102, 'za':321, 'bs':10}. Я обнаружил, что некогда поддерживать порядок, когда он уже создан. То, что я сделал, это сделать json файл вместо этого объекта:

{"ac":33,"gw":20,"ap":102,"za":321,"bs":10}

Я использовал:

r = json.load(open('file.json'), object_pairs_hook=OrderedDict)

затем используется:

print json.dumps(r)

чтобы проверить.

Ответ 8

Как правило, вы можете создать класс, который ведет себя как словарь, в основном реализуя методы __contains__, __getitem__, __delitem__, __setitem__ и некоторые другие. Этот класс может иметь любое поведение, которое вам нравится, например, разделяя отсортированный итератор на клавиши...

Ответ 9

У меня была похожая проблема при разработке проекта Django. Я не мог использовать OrderedDict, потому что у меня работала старая версия python, поэтому решение было использовать класс Django SortedDict:

https://code.djangoproject.com/wiki/SortedDict

например,

from django.utils.datastructures import SortedDict
d2 = SortedDict()
d2['b'] = 1
d2['a'] = 2
d2['c'] = 3

Примечание. Этот ответ был получен в 2011 году. Если у вас есть доступ к Python версии 2.7 или более поздней, у вас должен быть доступ к стандартным collections.OrderedDict, которые теперь являются стандартными .OrderedDict, многие примеры которого были предоставлены другими пользователями в этой теме.

Ответ 10

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

>>> list =[[1,2],[2,3]]
>>> for i in list:
...     print i[0]
...     print i[1]

1
2
2
3

Ответ 11

from collections import OrderedDict
list1 = ['k1', 'k2']
list2 = ['v1', 'v2']
new_ordered_dict = OrderedDict(zip(list1, list2))
print new_ordered_dict
# OrderedDict([('k1', 'v1'), ('k2', 'v2')])

Ответ 12

Вы можете сделать то же самое, что я сделал для словаря.

Создайте список и пустой словарь:

dictionary_items = {}
fields = [['Name', 'Himanshu Kanojiya'], ['email id', '[email protected]']]
l = fields[0][0]
m = fields[0][1]
n = fields[1][0]
q = fields[1][1]
dictionary_items[l] = m
dictionary_items[n] = q
print dictionary_items

Ответ 13

Другой альтернативой является использование панды dataframe как это гарантирует порядок и расположение индекс элементов в Словаре-подобной структуры.