"Можно ли добавить ключ в словарь Python после того, как он был создан? Кажется, у него нет метода .add ()."
Да, это возможно, и у него есть метод, который реализует это, но вы не хотите использовать его напрямую.
Чтобы продемонстрировать, как и как его не использовать, давайте создадим пустой dict с литералом dict, {}
:
my_dict = {}
Лучшая практика 1: индексная запись
Чтобы обновить этот диктовку одним новым ключом и значением, вы можете использовать нижнюю запись (см. Здесь «Сопоставления») , которая предусматривает назначение элемента:
my_dict['new key'] = 'new value'
my_dict
сейчас:
{'new key': 'new value'}
Лучшая практика 2: update
метод - 2 способа
Мы также можем эффективно обновить dict несколькими значениями, используя метод 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'}
Другой эффективный способ сделать это с помощью метода update - использовать аргументы с ключевыми словами, но, поскольку они должны быть допустимыми словами Python, вы не можете иметь пробелы или специальные символы или начинать имя с числа, но многие считают это более читаемый способ создания ключей для диктовки, и здесь мы, конечно, избегаем создания лишних ненужных 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'}
Итак, теперь мы рассмотрели три Pythonic способа обновления 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, то есть использование языка так, как это было задумано, обычно более читабельно и вычислительно эффективно.