Начиная с Python 3.6 встроенный dict будет заказан
Хорошая новость: исходный сценарий использования OP для отображения пар, извлеченных из базы данных с уникальными строковыми идентификаторами в качестве ключей и числовыми значениями в качестве значений во встроенном Python v3.6 + dict, теперь должен соответствовать порядку вставки.
Если, скажем, результирующие выражения таблицы в два столбца из запроса к базе данных, как:
SELECT a_key, a_value FROM a_table ORDER BY a_value;
будет храниться в двух кортежах Python, k_seq и v_seq (выровненных по числовому индексу и, конечно же, с одинаковой длиной), затем:
k_seq = ('foo', 'bar', 'baz')
v_seq = (0, 1, 42)
ordered_map = dict(zip(k_seq, v_seq))
Разрешить вывод позже как:
for k, v in ordered_map.items():
print(k, v)
уступая в этом случае (для нового Python 3.6+ встроенный dict!):
foo 0
bar 1
baz 42
в том же порядке на значение v.
Где в Python 3.5 установить на моей машине это в настоящее время дает:
bar 1
foo 0
baz 42
Подробности:
Как было предложено в 2012 году Рэймондом Хеттингером (см. Почту на python-dev с темой «Более компактные словари с более быстрой итерацией» ), а теперь (в 2016 году) объявлено в письме Виктора Стиннера к python-dev с темой «Python 3.6 dict становится компактный и получает приватную версию, а ключевые слова упорядочиваются « из-за исправления / реализации проблемы 27350 « компактный и упорядоченный дикт » в Python 3.6, теперь мы сможем использовать встроенный dict для поддержания порядка вставки !!
Надеемся, что это приведет к тонкому слою реализации OrderedDict в качестве первого шага. Как указывало @ JimFasarakis-Hilliard, некоторые видят варианты использования для типа OrderedDict и в будущем. Я думаю, что сообщество Python в целом тщательно проверит, выдержит ли это испытание временем, и какими будут следующие шаги.
Время переосмыслить наши привычки кодирования, чтобы не упустить возможности, открываемые стабильным упорядочением:
- Ключевое слово аргументы и
- промежуточное хранение
Первый, потому что в некоторых случаях он облегчает выполнение функций и методов.
Второе, поскольку это способствует более легкому использованию dict
s в качестве промежуточного хранилища в технологических трубопроводах.
Рэймонд Хеттингер любезно предоставил документацию, объясняющую « Технология позади словарей Python 3.6 » - из своей презентации в Сан-Франциско Python Meetup Group 2016-DEC-08.
И, может быть, довольно много страниц с вопросами и ответами в Stack Overflow получат варианты этой информации, и многие высококачественные ответы также потребуют обновления для каждой версии.
Предостережение Emptor (но также см. Ниже обновление 2017-12-15):
Как справедливо замечает @ajcr: «Сохраняющий порядок аспект этой новой реализации считается деталью реализации и на нее не следует полагаться». (из whatsnew36 ) не гнида, а цитата была вырезана немного пессимистично ;-). Это продолжается как "(это может измениться в будущем, но желательно иметь эту новую реализацию dict в языке в течение нескольких выпусков, прежде чем изменять спецификацию языка, чтобы предписывать семантику сохранения порядка для всех текущих и будущих реализаций Python; это также помогает сохранить обратную совместимость со старыми версиями языка, где все еще действует случайный порядок итераций, например, Python 3.5). "
Как и в некоторых человеческих языках (например, в немецком), использование определяет язык, и завещание было объявлено ... в whatsnew36 .
Обновление 2017-12-15:
В письме к списку python-dev Гвидо ван Россум заявил:
Сделай это так. «Dict сохраняет порядок вставки» - это решение. Спасибо!
Таким образом, побочный эффект CPython версии 3.6 от порядка вставки dict теперь становится частью языковой спецификации (а не только детали реализации). Эта ветка почты также выявила некоторые отличительные цели дизайна, о collections.OrderedDict
чем напомнил Рэймонд Хеттингер в ходе обсуждения.