Как добавить новый ключ с элементом на 0 индекс в словаре?
У меня есть словарь:
pp = {'title': 'jr', 'description': '64', 'price': '3'}
Я хотел бы добавить в него ключ на 0 индекс, чтобы все остальные ключи только сдвинулись, вывод должен быть:
{'key:': '#789', 'title': 'jr', 'description': '64', 'price': '3'}
В качестве ключа рассматриваю 'key' cо значением '#789'.
Ответы (3 шт):
У элементов словаря не существует индекса. Да и гарантированное сохранение порядка ключей словаря появилось только в 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
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).
А ещё есть 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'}