Начиная с 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()
метода ).
dict()
Документация включает в себя даже пример.содержит
Если значения
True
(или любой другой неизменный объект), вы также можете использовать:источник
OrderedDict(FUTURE=[], TODAY=[], PAST=[])
виду, что такие решения, как: не будут работать, когда упомянуто о подходе:OrderedDict([('FUTURE', []), ('TODAY', []), ('PAST', [])])
будут поддерживать порядок.Вместо объяснения теоретической части приведу простой пример.
источник
OrderedDict
действительно решает проблему, но ... в этом конкретном примере вы получите точно такой же результат, используя стандартный словарь{'aol': 1, 'foo': 3}
так что я думаю, что это хороший иллюстративный пример.OrderedDict.update()
с итератора парами , содержащими ключ-значение:d1.upate([(key1, val1), (key2, val2)])
.Обратите внимание, что этот ответ относится к версиям Python до Python3.7. CPython 3.6 поддерживает порядок вставки в большинстве случаев как деталь реализации. Начиная с Python3.7, было объявлено, что реализации ДОЛЖНЫ поддерживать порядок вставки, чтобы быть совместимыми.
Словари Python неупорядочены. Если вы хотите заказать словарь, попробуйте collection.OrderedDict .
Обратите внимание, что OrderedDict был введен в стандартную библиотеку в python 2.7. Если у вас более старая версия python, вы можете найти рецепты заказанных словарей в ActiveState .
источник
Словари будут использовать порядок, который делает поиск эффективным, и вы не можете изменить это,
Вы можете просто использовать список объектов (кортеж из 2 элементов в простом случае или даже класс) и добавлять элементы в конец. Затем вы можете использовать линейный поиск, чтобы найти элементы в нем.
В качестве альтернативы вы можете создать или использовать другую структуру данных, созданную с целью поддержания порядка.
источник
Я наткнулся на этот пост, пытаясь выяснить, как заставить OrderedDict работать. PyDev для Eclipse не смог найти OrderedDict вообще, поэтому я решил сделать кортеж из значений моего словаря, как я хотел бы, чтобы они были упорядочены. Когда мне нужно было вывести свой список, я просто перебирал значения кортежа и вставлял повторяющийся «ключ» из кортежа в словарь, чтобы получить мои значения в том порядке, в котором они мне нужны.
пример:
Это немного громоздко, но мне не хватает времени, и это обходной путь, который я нашел.
примечание: подход со списком списков, который предложил кто-то другой, на самом деле не имеет смысла для меня, потому что списки упорядочены и проиндексированы (и также имеют другую структуру, чем словари).
источник
Вы не можете действительно делать то, что вы хотите со словарем. У вас уже есть словарь
d = {'ac':33, 'gw':20, 'ap':102, 'za':321, 'bs':10}
. Я обнаружил, что не было никакого способа поддерживать порядок, когда он уже создан. Вместо этого я создал файл json с объектом:Я использовал:
затем использовали:
проверять.
источник
источник
Другой альтернативой является использование Pandas,
dataframe
поскольку он гарантирует порядок и индексные позиции элементов в структуре, похожей на диктовку.источник
Как правило, вы можете создать класс , который ведет себя как словарь, главным образом , быть реализации методов
__contains__
,__getitem__
,__delitem__
,__setitem__
и некоторые другие. Этот класс может иметь любое поведение, которое вам нравится, например, выделение отсортированного итератора для ключей ...источник
если вы хотите иметь словарь в определенном порядке, вы также можете создать список списков, где первый элемент будет ключом, а второй элемент будет значением и будет выглядеть следующим образом
источник
У меня была похожая проблема при разработке проекта Django. Я не мог использовать OrderedDict, потому что у меня была старая версия python, поэтому решение было использовать класс SortedDict Django:
https://code.djangoproject.com/wiki/SortedDict
например,
Примечание. Этот ответ был получен в 2011 году. Если у вас есть доступ к Python версии 2.7 или выше, то вы должны иметь доступ к стандарту
collections.OrderedDict
, который сейчас приведен , и многие примеры были предоставлены другими в этой теме.источник
Вы можете сделать то же самое, что я сделал для словаря.
Создайте список и пустой словарь:
источник