Хранение записей словаря Python в порядке их нажатия
Словарь Python хранится не в определенном порядке (у отображений нет порядка), например
>>> myDict = {'first':'uno','second':'dos','third':'tres'}
myDict = {'first':'uno','second':'dos','third':'tres'}
>>> myDict
myDict
{'second': 'dos', 'third': 'tres', 'first': 'uno'}
Хотя можно получить отсортированный список или кортеж из словаря, мне интересно, можно ли сделать так, чтобы словарь сохранял элементы в том порядке, в котором они ему переданы, в предыдущем примере это означало бы наличие внутреннего порядка как {'first':'uno','second':'dos','third':'tres'}
и ничем не отличаются.
Мне это нужно, потому что я использую словарь для хранения значений при чтении их из файла конфигурации; после прочтения и обработки (значения изменяются) они должны быть записаны в новый файл конфигурации в том же порядке, в котором они были прочитаны (этот порядок не является ни алфавитным, ни числовым).
Какие-нибудь мысли?
Обратите внимание, что я не ищу второстепенные способы получения порядка (например, списки), но способы заставить словарь упорядочиваться сам по себе (как это будет в следующих версиях Python).
Ответы
Ответ 1
Попробуйте python 2.7 и выше, возможно, 3.1, есть OrderedDict
http://www.python.org/
http://python.org/download/releases/2.7/
>>> from collections import OrderedDict
>>> d = OrderedDict([('first', 1), ('second', 2),
... ('third', 3)])
>>> d.items()
[('first', 1), ('second', 2), ('third', 3)]
PEP 372: добавление упорядоченного словаря в коллекции
Ответ 2
Используйте список, чтобы сохранить порядок клавиш
Ответ 3
Реализации сохраняющих порядок словарей, безусловно, существуют.
Существует этот в Django, смутно названный SortedDict
, который будет работать в Python >= 2.3 iirc.
Ответ 4
Словари в Python реализованы как хеш-таблицы, поэтому порядок выглядит случайным. Вы могли бы реализовать свой собственный вариант дикта, который будет сортироваться, но вы потеряете удобный синтаксис. Вместо этого следите за порядком клавиш.
Инициализация:
keys = []
myDict = {}
При чтении:
myDict[key] = value
keys.append(key)
При записи:
for key in keys:
print key, myDict[key]
Ответ 5
Вместо того, чтобы объяснять теоретическую часть, я приведу простой пример.
>>> from collections import OrderedDict
>>> my_dictionary=OrderedDict()
>>> my_dictionary['foo']=3
>>> my_dictionar['aol']=1
>>> my_dictionary
OrderedDict([('foo', 3), ('aol', 1)])
Ответ 6
Есть очень короткий ответ на этот вопрос.
сделайте это -
dictCopy = yourdictname.copy()
то используйте dictCopy, он будет в том же порядке.