Должно ли это бросить KeyError? - PullRequest
0 голосов
/ 10 ноября 2019

Я практиковал некоторые алгоритмические вопросы и натолкнулся на следующий отрывок на днях в Python 3:

for i, num in enumerate(nums):
   n = target - num
   if n not in h:
      h[num] = i

Разве этот код не должен выдавать KeyError, поскольку h[num] не определено? Я подумал, что когда это происходит, нам нужно использовать collections.defaultdict(), чтобы предотвратить KeyError.

Я сталкивался с этим раньше, и он использует defaultdict, чтобы избежать KeyErrors, как утверждает автор, но я неЗдесь нет разницы между ними.

targets = collections.defaultdict(list)
   for a, b in sorted(tickets)[::-1]:
      targets[a] += b,

1 Ответ

0 голосов
/ 10 ноября 2019

Ваш второй пример отличается от вашего первого.

Во-первых, вы просто устанавливаете пару ключ / значение. Однако в секунду вы получаете , получая предыдущее значение , а затем переназначаете его на клавишу.

targets[a] += b

Считается, что его разбили на

old_value = targets[a]  # This will raise a key error if `a` doesn't exist already
targets[a] = old_value + b  # This will never raise an error

Ваш первый пример похож на вторую строку. Простая перезапись всегда хорошо. Для примера targets требуется поиск предыдущего значения. С обычным словарем это вызовет KeyError, если ключ не существует. Хотя со словарем по умолчанию это нормально, поскольку предоставляется значение по умолчанию.

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