У меня есть словарь, который я объявлял в определенном порядке и хочу держать его в этом порядке все время. [/ D0]
Так что, если у меня есть словарь:
d = {'ac': 33, 'gw': 20, 'ap': 102, 'za': 321, 'bs': 10}
, то я не хочу, чтобы его можно было сохранить в порядке, основанном на их значении. Это не в том порядке, если я просматриваю его или перебираю через него, есть ли способ убедиться, что Python будет поддерживать явный порядок, в котором я объявлял ключи / значения в?
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)
У меня была аналогичная проблема при разработке проекта Django. Я не мог использовать OrderedDict, потому что я запускал старую версию python, поэтому простым решением было использование класса SortedDict Django:
https://code.djangoproject.com/wiki/SortedDict
, если вы хотите иметь словарь в определенном порядке, вы также можете создать список списков, где первым элементом будет ключ, а второй элемент будет значением и будет выглядеть в этом примере
>>> list =[[1,2],[2,3]]
>>> for i in list:
... print i[0]
... print i[1]
1
2
2
3
Словари будут использовать порядок, который делает поиск эффективным, и вы не можете изменить его,
Вы могли бы просто использовать список объектов (2 элемента кортежа в простом случае или даже класс) и добавьте элементы в конец. Затем вы можете использовать линейный поиск для поиска элементов в нем.
В качестве альтернативы вы можете создать или использовать другую структуру данных, созданную с целью поддержания порядка.
Начиная с версии Python 3.6 стандарт dict поддерживает порядок вставки по умолчанию.
Определение
d = {'ac':33, 'gw':20, 'ap':102, 'za':321, 'bs':10}
приведет к созданию словаря с ключами в указанном порядке в исходном коде.
Это было достигнуто с помощью простого массива с целыми числами для разреженной хеш-таблицы, где эти целые числа индексируются в другой массив, в котором хранятся пары ключ-значение (плюс расчетный хеш). Этот последний массив просто хранит элементы в порядке вставки, и вся комбинация фактически использует меньше памяти, чем реализация, используемая в Python 3.5 и ранее. См. Исходную идею идеи Раймонда Хеттингера.
В 3.6 это все еще считалось деталью реализации; см. исходную идею идеи Раймонда Хеттингера :
Аспект сохранения порядка этой новой реализации рассматривается как деталь реализации и не следует полагаться (это может измениться в будущем , но желательно, чтобы эта новая реализация dict в языке для нескольких выпусков до изменения спецификации языка для мандатной семантики сохранения порядка для всех текущих и будущих реализаций Python, что также помогает сохранить обратную совместимость со старыми версиями языка где случайный порядок итераций все еще действует, например Python 3.5).Python 3.7 возводит эту деталь реализации в спецификацию языка, поэтому теперь обязательно dict сохраняет порядок во всех реализациях Python, совместимых с этой версией или новее. См. Объявление BDFL.
В некоторых случаях вы все еще можете использовать высказывание BDFL , поскольку оно предлагает некоторые дополнительные функции поверх стандартного dict тип. Такие, как обратимые (это распространяется на объекты вида) и поддерживают переупорядочение (с помощью метода move_to_end()).
Обратите внимание, что этот ответ относится к версиям python до python3.7. CPython 3.6 поддерживает порядок вставки в большинстве случаев как деталь реализации. Начиная с Python3.7, было объявлено, что реализации ДОЛЖНЫ поддерживать порядок вставки, чтобы быть совместимым.
словари python неупорядочены. Если вы хотите упорядоченный словарь, попробуйте collection.OrderedDict.
Обратите внимание, что OrderedDict был введен в стандартную библиотеку в python 2.7. Если у вас более старая версия python, вы можете найти рецепты для упорядоченных словарей в коллекциях . Oderedict .
Вы не можете делать то, что хотите, со словарем. У вас уже есть словарь 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)
to проверить.
Как правило, вы можете создать класс, который ведет себя как словарь, в основном реализуя методы __contains__, __getitem__, __delitem__, __setitem__ и некоторые другие. Этот класс может иметь любое поведение, которое вам нравится, например, разбивая отсортированный итератор на клавиши ...
Я столкнулся с этим сообщением, пытаясь выяснить, как заставить OrderedDict работать. PyDev для Eclipse вообще не смог найти OrderedDict, поэтому я решил сделать кортеж ключевых значений моего словаря, поскольку я бы хотел, чтобы они были заказаны. Когда мне нужно было вывести свой список, я просто повторил значения кортежа и включил итерированный «ключ» из кортежа в словарь, чтобы получить мои значения в том порядке, в котором они мне были нужны.
example:
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: список подходов к списку, который кто-то еще предложил, на самом деле имеют смысл для меня, потому что списки упорядочены и индексируются (и также отличаются от словарей).
Вместо объяснения теоретической части я приведу простой пример.
>>> from collections import OrderedDict
>>> my_dictionary=OrderedDict()
>>> my_dictionary['foo']=3
>>> my_dictionary['aol']=1
>>> my_dictionary
OrderedDict([('foo', 3), ('aol', 1)])