Сортировка ключей по умолчанию в словаре
Встретилась с такой ситуацией в питоне 2: ключи в словаре, что изначально имели вид
['h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'h7', 'h8', 'h9']
отсортировались в таком порядке по умолчанию: (привела на картинке)
Каким образом получился именно такой вид? Не могу понять, как так вообще получилось. я попыталась угадать структуру дерева, но логики нигде нет 
Ответы (1 шт):
До версии Python 3.6 порядок ключей в словаре никак не гарантировался. Т.е. при обращении к словарю вы можете получить ключи не в том порядке, в котором они заносились в словарь.
Начиная с Python 3.6 в CPython (самая распространенная реализация языка) порядок вставки сохраняется и соблюдается при обращении к словарю. Т.е. сохранение порядка гарантируется на уровне данной реализации, но не на уровне языка - в других реализациях такой гарантии нет
Начиная с Python 3.7 сохранение порядка вставки гарантируется на уровне языка Python, т.е. обязательно для всех реализаций.
PS связанный вопрос в английской версии SO
UPDATE: Если быть точнее, то словари работают по-разному в разных версиях Python:
- Python 2.7 - ключи словаря возвращаются всегда в одном и том же порядке, но порядок обычно не соответсвовал порядку занесения в словарь. Основано на хеш-таблицах.
- Python 3.5 - ключи словаря возвращаются в случайном порядке. Т.е при двух последовательных обращениях порядок может быть разным.
- Python 3.6 - ключи словаря возвращаются в том порядке, в котором они вставлялись. (для CPython реализации)
- Python 3.7+ - ключи словаря возвращаются в том порядке, в котором они вставлялись. (вне зависимости от реализации Python)
PPS подробнее об эволюции словарей в Python
Вывод: если вы работает с Python версии < 3.7 и хотите гарантированный порядок обращения к ключам, используйте OrderedDict, начиная с Python 3.7 можно использовать "нативный" dict.