Начиная с 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)
в этом случае (для нового встроенного dict Python 3.6+!):
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 «Компактный и упорядоченный dict» в Python 3.6 теперь мы сможем использовать встроенный dict для поддержания порядка вставки !!
Надеюсь, это приведет к реализации тонкого слоя OrderedDict в качестве первого шага. Как указал @ JimFasarakis-Hilliard, некоторые видят варианты использования типа OrderedDict также в будущем. Я думаю, что сообщество Python в целом внимательно изучит, выдержит ли это испытание временем, и каковы будут следующие шаги.
Пора переосмыслить наши привычки кодирования, чтобы не упустить возможности, открывающиеся благодаря стабильному упорядочиванию:
- аргументы ключевого слова и
- (промежуточное) хранилище dict
Первый, потому что в некоторых случаях он упрощает диспетчеризацию при реализации функций и методов.
Второй, поскольку он способствует более простому использованию dict
в качестве промежуточного хранилища в конвейерах обработки.
Раймонд Хеттингер любезно предоставил документацию, объясняющую «Технологии, лежащие в основе словарей Python 3.6» - из его презентации San Francisco Python Meetup Group 2016-DEC-08.
И, возможно, некоторые страницы вопросов и ответов, украшенные Stack Overflow, получат варианты этой информации, и многие высококачественные ответы также потребуют обновления для каждой версии.
Caveat Emptor (но также см. Ниже обновление 2017-12-15):
Как справедливо отмечает @ajcr: «Сохраняющий порядок аспект этой новой реализации считается деталью реализации, и на нее не следует полагаться». (из whatsnew36) не придирки, но цитата была урезана немного пессимистично ;-). Он продолжается как "(это может измениться в будущем, но желательно иметь эту новую реализацию dict на языке в течение нескольких выпусков, прежде чем изменять спецификацию языка, чтобы требовать семантику сохранения порядка для всех текущих и будущих реализаций Python; это также помогает сохранить обратную совместимость со старыми версиями языка, где все еще действует случайный порядок итераций, например Python 3.5) ".
Так же, как в некоторых человеческих языках (например, немецком), использование формирует язык, и теперь было объявлено завещание ... в whatsnew36.
Обновление 2017-12-15:
В письме в список python-dev Гвидо ван Россум заявил:
Сделай так. «Dict сохраняет порядок размещения» - таково постановление. Спасибо!
Итак, побочный эффект CPython версии 3.6, связанный с порядком вставки dict, теперь становится частью спецификации языка (а не только деталью реализации). В этой почтовой переписке также всплыли некоторые отличительные цели дизайна для collections.OrderedDict
, как напомнил Раймонд Хеттингер во время обсуждения.
Структура данных словаря не имеет внутреннего порядка. Вы можете перебирать его, но нет ничего, что могло бы гарантировать, что итерация будет следовать какому-либо определенному порядку. Это сделано специально, поэтому лучше всего использовать другую структуру данных для представления.
«sorted ()» может работать со словарями (и возвращает список отсортированных ключей), поэтому я думаю, что он знает об этом. Не зная его программы, абсурдно говорить кому-то, что они используют неправильную структуру данных. Если в 90% случаев вам нужен быстрый поиск, то, вероятно, вам нужен dict.
Все три вывода (ключи, значения, оба) для сортировки словарей описаны здесь в ясном и кратком стиле: coderhelper.com/questions/16772071/sort-dict-by-value-python
@Daishiman Базовый класс не может быть упорядочен, но OrderedDict, конечно же.
В словарях Python 3.6+ порядок вставки сохраняется. Это, конечно, не то же самое, что возможность их сортировки по значению, но, с другой стороны, больше нельзя говорить, что «структура данных словаря не имеет внутреннего порядка».