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

Можно ли добавить ключ в словарь Python после его создания?

Кажется, у него нет .add() метода.


person lfaraone    schedule 21.06.2009    source источник
comment
Если вы здесь пытаетесь выяснить, как добавить ключ и вернуть новый словарь, вы можете сделать это на python3.5 +: {**mydict, 'new_key': new_val}.   -  person cs95    schedule 19.12.2018
comment
Либо используйте принятый ответ: d ['mynewkey'] = 'mynewvalue', либо вы можете использовать val = d.setdefault ('mynewkey', 'mynewvalue')   -  person Ol' Dawg    schedule 07.01.2020
comment
Если вы просто используете ‹dictionary› [‹key›] = ‹value› и если ключ не существует, он будет добавлен автоматически.   -  person Jyotirmay Kumar Jha    schedule 30.12.2020


Ответы (18)


Вы создаете новую пару ключ / значение в словаре, присваивая значение этому ключу.

d = {'key': 'value'}
print(d)  # {'key': 'value'}

d['mynewkey'] = 'mynewvalue'

print(d)  # {'key': 'value', 'mynewkey': 'mynewvalue'}

Если ключ не существует, он добавляется и указывает на это значение. Если он существует, текущее значение, на которое он указывает, перезаписывается.

person Paolo Bergantino    schedule 21.06.2009
comment
В чем разница между этим методом и методом .update()? Что лучше когда? - person hegash; 16.01.2019
comment
@hegash синтаксис d[key]=val, поскольку он короче и может обрабатывать любой объект в качестве ключа (пока он хешируемый) и устанавливает только одно значение, тогда как .update(key1=val1, key2=val2) лучше, если вы хотите установить несколько значений одновременно, пока ключи являются строками (поскольку kwargs преобразованы в строки). dict.update также может взять другой словарь, но я лично предпочитаю не создавать новый словарь явно для обновления другого. - person bgusach; 13.02.2019
comment
как я могу добавить элемент во вложенный dict. Как php $foo[ ] = [ . . . . ] - person Juan-Kabbali; 28.04.2020
comment
Пожалуйста, кто-нибудь может объяснить разницу между этим ответом и append (), например: a_dict [a] .append (привет) - person Selfcontrol7; 01.02.2021
comment
Основываясь на If it exists, the current value it points to is overwritten., как я могу элегантно проверить, существует ли уже ключ, который я пытаюсь добавить, а затем вызвать исключение? - person Kots; 25.02.2021

Чтобы добавить несколько ключей одновременно, используйте dict.update():

>>> x = {1:2}
>>> print(x)
{1: 2}

>>> d = {3:4, 5:6, 7:8}
>>> x.update(d)
>>> print(x)
{1: 2, 3: 4, 5: 6, 7: 8}

При добавлении одного ключа принятый ответ требует меньше вычислительных затрат.

person Community    schedule 22.07.2009
comment
это оооочень неэффективно создавать словарь только для обновления одного ключа. Делайте это, только если у вас более 1 ключа (может быть порог, выше которого лучше создать dict) - person Jean-François Fabre; 02.08.2018
comment
@ Jean-FrançoisFabre Это пример кода. Вы действительно не должны рассматривать ответы как охватывающие все случаи. - person Robert Brisita; 27.03.2019
comment
это создает неправильное впечатление, что это предпочтительный способ добавления одного ключа. - person Jean-François Fabre; 27.03.2019
comment
@ Jean-FrançoisFabre Поскольку порядок слов в Python 3.7+ гарантирован ( и предоставляется в 3.6+), это может быть предпочтительным способом добавления единственного ключа, когда порядок важен. - person ingyhere; 20.01.2020
comment
если вы создадите другой ключ, например x[-1] = 44, значение -1 тоже будет в конце. В любом случае ответ отредактирован и теперь намного лучше. Обновление с помощью словаря хорошо, когда вероятно, что он содержит много элементов. - person Jean-François Fabre; 20.01.2020

Я хочу объединить информацию о словарях Python:

Создание пустого словаря

data = {}
# OR
data = dict()

Создание словаря с начальными значениями

data = {'a': 1, 'b': 2, 'c': 3}
# OR
data = dict(a=1, b=2, c=3)
# OR
data = {k: v for k, v in (('a', 1), ('b',2), ('c',3))}

Вставка / обновление одного значения

data['a'] = 1  # Updates if 'a' exists, else adds 'a'
# OR
data.update({'a': 1})
# OR
data.update(dict(a=1))
# OR
data.update(a=1)

Вставка / обновление нескольких значений

data.update({'c':3,'d':4})  # Updates 'c' and adds 'd'

Python 3.9+:

оператор обновления |= теперь работает для словарей:

data |= {'c':3,'d':4}

Создание объединенного словаря без изменения оригиналов

data3 = {}
data3.update(data)  # Modifies data3, not data
data3.update(data2)  # Modifies data3, not data2

Python 3.5+:

При этом используется новая функция под названием распаковка словаря.

data = {**data1, **data2, **data3}

Python 3.9+:

оператор слияния | теперь работает для словарей:

data = data1 | {'c':3,'d':4}

Удаление элементов из словаря

del data[key]  # Removes specific element in a dictionary
data.pop(key)  # Removes the key & returns the value
data.clear()  # Clears entire dictionary

Проверить, есть ли ключ уже в словаре

key in data

Перебирать пары в словаре

for key in data: # Iterates just through the keys, ignoring the values
for key, value in d.items(): # Iterates through the pairs
for key in d.keys(): # Iterates just through key, ignoring the values
for value in d.values(): # Iterates just through value, ignoring the keys

Создать словарь из двух списков

data = dict(zip(list_with_keys, list_with_values))
person Yugal Jindle    schedule 05.12.2011
comment
Оператор OR | в 3.9, по-видимому, решает мою проблему с Python dicts, не имеющим шаблона построителя. - person WestCoastProjects; 24.02.2021

Можно ли добавить ключ в словарь Python после его создания? Похоже, у него нет метода .add ().

Да, это возможно, и у него есть метод, реализующий это, но вы не хотите использовать его напрямую.

Чтобы продемонстрировать, как и как не использовать его, давайте создадим пустой dict с литералом dict {}:

my_dict = {}

Лучшая практика 1. Обозначение нижнего индекса

Чтобы обновить этот словарь одним новым ключом и значением, вы можете использовать обозначение нижнего индекса (см. Сопоставления здесь), которое обеспечивает назначение элементов:

my_dict['new key'] = 'new value'

my_dict сейчас:

{'new key': 'new value'}

Лучшая практика 2. Метод update - 2 способа

Мы также можем эффективно обновить словарь несколькими значениями, используя метод update < / а>. Возможно, мы без необходимости создаем здесь дополнительный dict, поэтому мы надеемся, что наш dict уже был создан и получен или использовался для другой цели:

my_dict.update({'key 2': 'value 2', 'key 3': 'value 3'})

my_dict сейчас:

{'key 2': 'value 2', 'key 3': 'value 3', 'new key': 'new value'}

Другой эффективный способ сделать это с помощью метода обновления - использовать аргументы ключевого слова, но поскольку они должны быть законными словами Python, у вас не может быть пробелов или специальных символов или начинать имя с числа, но многие считают это более читаемым способом. для создания ключей для dict, и здесь мы, конечно, избегаем создания лишних ненужных dict:

my_dict.update(foo='bar', foo2='baz')

и my_dict сейчас:

{'key 2': 'value 2', 'key 3': 'value 3', 'new key': 'new value', 
 'foo': 'bar', 'foo2': 'baz'}

Итак, теперь мы рассмотрели три способа обновления dict.


Магический метод, __setitem__, и почему его следует избегать

Есть другой способ обновления dict, который вам не следует использовать, он использует метод __setitem__. Вот пример того, как можно использовать метод __setitem__ для добавления пары ключ-значение к dict, и демонстрация низкой производительности его использования:

>>> d = {}
>>> d.__setitem__('foo', 'bar')
>>> d
{'foo': 'bar'}


>>> def f():
...     d = {}
...     for i in xrange(100):
...         d['foo'] = i
... 
>>> def g():
...     d = {}
...     for i in xrange(100):
...         d.__setitem__('foo', i)
... 
>>> import timeit
>>> number = 100
>>> min(timeit.repeat(f, number=number))
0.0020880699157714844
>>> min(timeit.repeat(g, number=number))
0.005071878433227539

Итак, мы видим, что использование нижнего индекса на самом деле намного быстрее, чем использование __setitem__. Выполнение вещей Pythonic, то есть использование языка так, как он был предназначен для использования, обычно является более читаемым и более эффективным с точки зрения вычислений.

person Aaron Hall    schedule 29.11.2014
comment
В 2020 году разница гораздо менее заметна (на моей машине индексирование 1,35 мс против 2 мс для d.__setitem__), хотя вывод (и особенно последнее предложение) остается верным. Выведение поиска имени метода из цикла сократило время примерно до 1,65 мс; остающаяся разница, вероятно, в значительной степени связана с неизбежными накладными расходами на механизм вызова Python. - person holdenweb; 05.02.2020

Если вы хотите добавить словарь в словарь, вы можете сделать это следующим образом.

Пример: добавить новую запись в словарь и дополнительный словарь

dictionary = {}
dictionary["new key"] = "some new entry" # add new dictionary entry
dictionary["dictionary_within_a_dictionary"] = {} # this is required by python
dictionary["dictionary_within_a_dictionary"]["sub_dict"] = {"other" : "dictionary"}
print (dictionary)

Вывод:

{'new key': 'some new entry', 'dictionary_within_a_dictionary': {'sub_dict': {'other': 'dictionarly'}}}

ПРИМЕЧАНИЕ. Python требует, чтобы вы сначала добавили подпрограмму

dictionary["dictionary_within_a_dictionary"] = {}

перед добавлением записей.

person Asher    schedule 26.04.2012
comment
это не имеет отношения к заданному вопросу, как и большинство комментариев на страницах руководства php.net ... - person Erik Kaplun; 02.06.2012
comment
Ничто не мешает вам делать это в одной строке: dictionary = {"dictionary_within_a_dictionary": {"sub_dict": {"other" : "dictionary"}}} (или, если dictionary уже является dict, dictionary["dictionary_within_a_dictionary"] = {"sub_dict": {"other" : "dictionary"}}) - person Chris; 27.12.2017

Стандартный синтаксис - d[key] = value, но если на вашей клавиатуре отсутствуют клавиши с квадратными скобками, вы также можете сделать:

d.__setitem__(key, value)

Фактически, определение методов __getitem__ и __setitem__ - это то, как вы можете заставить ваш собственный класс поддерживать синтаксис квадратных скобок. См. https://python.developpez.com/cours/DiveIntoPython/php/endiveintopython/object_oriated_framework/special_class_methods.php

person Colonel Panic    schedule 14.04.2013
comment
Мне было бы чрезвычайно сложно программировать на python без клавиш-скобок на клавиатуре. - person Bobort; 27.10.2016
comment
Это был единственный способ установить значения словаря в понимании списка. Спасибо - person chris stevens; 18.05.2018
comment
@chrisstevens, если вы хотите установить значение в понимании, я использовал хак [a for a in my_dict if my_dict.update({'a': 1}) is None]. - person Jeremy Logan; 14.09.2018
comment
Любопытно ... это обычное явление (например, отсутствие квадратных скобок)? - person Aleister Tanek Javas Mraz; 13.08.2019
comment
@chrisstevens @JeremyLogan Зачем использовать понимание списка, если вы можете использовать понимание dict? {v: k for k, v in my_dict.items() if <some_conditional_check>} - person ingyhere; 20.01.2020

Вы можете создать его:

class myDict(dict):

    def __init__(self):
        self = dict()

    def add(self, key, value):
        self[key] = value

## example

myd = myDict()
myd.add('apples',6)
myd.add('bananas',3)
print(myd)

Дает:

>>> 
{'apples': 6, 'bananas': 3}
person kiriloff    schedule 25.05.2013

Этот популярный вопрос касается функциональные методы объединения словарей a и b.

Вот некоторые из наиболее простых методов (протестированных на Python 3) ...

c = dict( a, **b ) ## see also https://stackoverflow.com/q/2255878
c = dict( list(a.items()) + list(b.items()) )
c = dict( i for d in [a,b] for i in d.items() )

Примечание. Первый метод выше работает, только если ключи в b являются строками.

Чтобы добавить или изменить один элемент, словарь b должен содержать только этот один элемент ...

c = dict( a, **{'d':'dog'} ) ## returns a dictionary based on 'a'

Это эквивалентно ...

def functional_dict_add( dictionary, key, value ):
   temp = dictionary.copy()
   temp[key] = value
   return temp

c = functional_dict_add( a, 'd', 'dog' )
person Brent Bradburn    schedule 17.08.2013
comment
Интересный комментарий о первом методе из Python BDFL (здесь). - person Brent Bradburn; 18.08.2013
comment
c = dict( a, **{'d':'dog'} ) лучше было бы записать как c = dict(a, d='dog'), если ключи известны и не вычисляются. - person holdenweb; 05.02.2020

Давайте представим, что вы хотите жить в неизменном мире и НЕ хотите изменять оригинал, а хотите создать новый dict, который является результатом добавления нового ключа к оригиналу.

В Python 3.5+ вы можете:

params = {'a': 1, 'b': 2}
new_params = {**params, **{'c': 3}}

Эквивалент Python 2:

params = {'a': 1, 'b': 2}
new_params = dict(params, **{'c': 3})

После любого из них:

params по-прежнему равно {'a': 1, 'b': 2}

а также

new_params невероятно похож на {'a': 1, 'b': 2, 'c': 3}

Бывают случаи, когда вы не хотите изменять оригинал (вам нужен только результат добавления к оригиналу). Я считаю это отличной альтернативой следующему:

params = {'a': 1, 'b': 2}
new_params = params.copy()
new_params['c'] = 3

or

params = {'a': 1, 'b': 2}
new_params = params.copy()
new_params.update({'c': 3})

Ссылка: https://stackoverflow.com/a/2255892/514866

person campeterson    schedule 12.01.2018
comment
В продолжительном разговоре с моим коллегой по функциональному программированию был поднят хороший момент. Одним из недостатков вышеупомянутого подхода является то, что если кто-то, читающий код, не знаком с ** в Python (многие не знакомы), тогда не будет очевидно, что происходит. Бывают случаи, когда вы предпочитаете менее функциональный подход для лучшей читаемости. - person campeterson; 30.01.2018
comment
Мы не можем предвидеть, какое подмножество языка Python знают наши читатели, поэтому справедливо предположить, что они знают весь язык, поэтому они ищут в документации части, которых не знают. - person Gabriel; 07.03.2018

Так много ответов, но все еще забыли о странном названии, странном поведении, но все же удобном dict.setdefault()

Этот

value = my_dict.setdefault(key, default)

в основном просто делает это:

try:
    value = my_dict[key]
except KeyError: # key not found
    value = my_dict[key] = default

e.g.

>>> mydict = {'a':1, 'b':2, 'c':3}
>>> mydict.setdefault('d', 4)
4 # returns new value at mydict['d']
>>> print(mydict)
{'a':1, 'b':2, 'c':3, 'd':4} # a new key/value pair was indeed added
# but see what happens when trying it on an existing key...
>>> mydict.setdefault('a', 111)
1 # old value was returned
>>> print(mydict)
{'a':1, 'b':2, 'c':3, 'd':4} # existing key was ignored
person Michael Ekoka    schedule 23.10.2017

Если вы не объединяете два словаря, а добавляете в словарь новые пары «ключ-значение», то использование подстрочной нотации кажется лучшим способом.

import timeit

timeit.timeit('dictionary = {"karga": 1, "darga": 2}; dictionary.update({"aaa": 123123, "asd": 233})')
>> 0.49582505226135254

timeit.timeit('dictionary = {"karga": 1, "darga": 2}; dictionary["aaa"] = 123123; dictionary["asd"] = 233;')
>> 0.20782899856567383

Однако, если вы хотите добавить, например, тысячи новых пар "ключ-значение", вам следует рассмотреть возможность использования метода update().

person Burak Özdemir    schedule 11.10.2018

Вот еще один способ, которого я здесь не видел:

>>> foo = dict(a=1,b=2)
>>> foo
{'a': 1, 'b': 2}
>>> goo = dict(c=3,**foo)
>>> goo
{'c': 3, 'a': 1, 'b': 2}

Вы можете использовать конструктор словаря и неявное расширение для восстановления словаря. Более того, что интересно, этот метод можно использовать для управления позиционным порядком во время построения словаря (post Python 3.6). Фактически, порядок вставки гарантирован для Python 3.7 и выше!

>>> foo = dict(a=1,b=2,c=3,d=4)
>>> new_dict = {k: v for k, v in list(foo.items())[:2]}
>>> new_dict
{'a': 1, 'b': 2}
>>> new_dict.update(newvalue=99)
>>> new_dict
{'a': 1, 'b': 2, 'newvalue': 99}
>>> new_dict.update({k: v for k, v in list(foo.items())[2:]})
>>> new_dict
{'a': 1, 'b': 2, 'newvalue': 99, 'c': 3, 'd': 4}
>>> 

Вышеупомянутое использует понимание словаря.

person ingyhere    schedule 19.11.2019

сначала, чтобы проверить, существует ли уже ключ

a={1:2,3:4}
a.get(1)
2
a.get(5)
None

затем вы можете добавить новый ключ и значение

person Agus Mathew    schedule 25.03.2019

Я думаю, что было бы также полезно указать на collections < / strong>, который состоит из множества полезных подклассов словарей и оболочек, которые упрощают добавление и изменение типов данных в словаре, в частности defaultdict:

подкласс dict, который вызывает фабричную функцию для предоставления отсутствующих значений

Это особенно полезно, если вы работаете со словарями, которые всегда состоят из одних и тех же типов данных или структур, например, со словарем списков.

>>> from collections import defaultdict
>>> example = defaultdict(int)
>>> example['key'] += 1
>>> example['key']
defaultdict(<class 'int'>, {'key': 1})

Если ключ еще не существует, defaultdict присваивает заданное значение (в нашем случае 10) как начальное значение для словаря (часто используется внутри циклов). Таким образом, эта операция выполняет две функции: добавляет новый ключ в словарь (согласно вопросу), и присваивает значение, если ключ еще не существует. стандартный словарь, это вызвало бы ошибку, поскольку операция += пытается получить доступ к значению, которое еще не существует:

>>> example = dict()
>>> example['key'] += 1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'key'

Без использования defaultdict объем кода для добавления нового элемента был бы намного больше и, возможно, выглядел бы примерно так:

# This type of code would often be inside a loop
if 'key' not in example:
    example['key'] = 0  # add key and initial value to dict; could also be a list
example['key'] += 1  # this is implementing a counter

defaultdict также можно использовать со сложными типами данных, такими как list и set:

>>> example = defaultdict(list)
>>> example['key'].append(1)
>>> example
defaultdict(<class 'list'>, {'key': [1]})

Добавление элемента автоматически инициализирует список.

person m_____z    schedule 27.08.2019

Вот простой способ!

your_dict = {}
your_dict['someKey'] = 'someValue'

Это добавит новую пару key: value в словарь your_dict с key = someKey и value = somevalue

Вы также можете использовать этот способ для обновления значения ключа somekey, если он уже существует в your_dict.

person Irfan wani    schedule 13.01.2021
comment
это сработало и в 2001 году! - person Boris; 12.02.2021
comment
Просто хотел прояснить, что время от времени многое меняется, особенно в программировании. - person Irfan wani; 12.02.2021
comment
Ирфан, вы идете против условностей, заявляя в 2021 году: в SOF принято говорить это только в том случае, если все действительно отличается от прошлого. - person WestCoastProjects; 24.02.2021
comment
Убрал строчку. И извините за это. - person Irfan wani; 24.02.2021

добавить ключ словаря, класс значения.

class myDict(dict):

    def __init__(self):
        self = dict()

    def add(self, key, value):
        #self[key] = value # add new key and value overwriting any exiting same key
        if self.get(key)!=None:
            print('key', key, 'already used') # report if key already used
        self.setdefault(key, value) # if key exit do nothing


## example

myd = myDict()
name = "fred"

myd.add('apples',6)
print('\n', myd)
myd.add('bananas',3)
print('\n', myd)
myd.add('jack', 7)
print('\n', myd)
myd.add(name, myd)
print('\n', myd)
myd.add('apples', 23)
print('\n', myd)
myd.add(name, 2)
print(myd)
person Susan    schedule 04.02.2020

Вы можете использовать квадратные скобки:

my_dict={}
my_dict["key"]="value"

Или вы можете использовать метод .update ():

my_another_dict={"key":"value"}
my_dict={}
my_dict.update(my_another_dict)

Надеюсь, это поможет: D

person Abhimanyu Sharma    schedule 16.04.2021

your_dict = {}

Чтобы добавить новый ключ:

  1. your_dict[key]=value

  2. your_dict.update(key=value)

person Odiljon Djamalov    schedule 18.01.2021