Как добавить новый ключ с элементом на 0 индекс в словаре?

У меня есть словарь:

pp = {'title': 'jr', 'description': '64', 'price': '3'}

Я хотел бы добавить в него ключ на 0 индекс, чтобы все остальные ключи только сдвинулись, вывод должен быть:

{'key:': '#789', 'title': 'jr', 'description': '64', 'price': '3'}

В качестве ключа рассматриваю 'key' cо значением '#789'.


Ответы (3 шт):

Автор решения: MaxU

У элементов словаря не существует индекса. Да и гарантированное сохранение порядка ключей словаря появилось только в Python 3.7 (в версии Python 3.6 это зависело от реализации).

Таким образом решить данную задачу можно только пересоздав словарь с правильным порядком ключей:

res = {**{'key:': '#789'}, **pp}

результат:

In [193]: res
Out[193]: {'key:': '#789', 'title': 'jr', 'description': '64', 'price': '3'}

PS для Python 3.9+ можно попробовать использовать новый оператор:

res = {'key:': '#789'} | pp
→ Ссылка
Автор решения: nomnoms12

TL;DR:

pp = {'key': '#789', **pp}

Порядок ключей в словаре не имеет значения, поэтому стандартного способа сделать это нет. Вам придётся пересоздать словарь.

До версии 3.6 (CPython) порядок ключей вообще не сохранялся. В версиях выше это поведение добавили из-за новой реализации словарей, при которой хеш-таблица хранится отдельно от данных, что позволяет непосредственно итерировать данные:

indices =  [None, 1, None, None, None, 0, None, 2]
entries =  [[-9092791511155847987, 'timmy', 'red'],
            [-8522787127447073495, 'barry', 'green'],
            [-6480567542315338377, 'guido', 'blue']]

Подробнее о новой реализации словарей можно прочитать в статье Немного внутренностей словарей в CPython (и PyPy).

→ Ссылка
Автор решения: CrazyElf

А ещё есть OrderedDict, гарантирующий порядок ключей в более ранних версиях питона:

from collections import OrderedDict

a = OrderedDict({'title': 'jr', 'description': '64', 'price': '3'})
a.update({'key': '#789'})
a.move_to_end('key', last=False)
print(a)
print(dict(a))

Вывод:

OrderedDict([('key', '#789'), ('title', 'jr'), ('description', '64'), ('price', '3')])
{'key': '#789', 'title': 'jr', 'description': '64', 'price': '3'}
→ Ссылка