Недавно я начал волонтерство помочь принять несколько ночлений практики интервью для местной группы Python Seattle, Щенок (puget sound programming python) И увидел, что некоторые удивительные люди собираются вместе, чтобы решить проблемы в доске в погибших ночи. Во время этих практических ночей я был в восторге от возможностей, которые я должен был поделиться одним из моих абсолютных любимых трюков Python, и сегодня я хотел бы поделиться с вами.
Вы были в ситуации, когда вам нужно было хранить частоту ключей в словаре и написали что-то похожее на это?
# Example 1 s = 'Hello World!' counts = {} for char in s: try: counts[char] += 1 # Equivalent to counts[char] = counts[char] + 1 except KeyError: counts[char] = 1
Я не особенно забочусь о взгляде этой попытки/кроме блока.
Проблема здесь заключается в том, что словари не имеют значения возврата по умолчанию, когда программа использует нотацию кронштейна для доступа к ключу, которая еще не присутствует в словаре. Вместо того, чтобы Python вместимость падает программа с KeyError
Отказ
В случае выше, если код в попробуйте
пункт бросает KeyError.
Мы знаем, что ключ отсутствует в словаре. Затем программа входит в кроме
Пункт, где мы добавляем ключ к словарю, явно присваивая ему значение 1. В следующий раз, когда ключ встречается с попробуйте
Пункт не будет бросать ошибку, а значение ключа будет увеличиваться на 1.
Что, если произошел лучший способ, что-то гладкое, то, что не вызывает, вы можете сознательно бросать ошибки в вашем коде?
Ну, оказывается, есть метод в словарях, который делает только что, .получать ()
. Призыв .получать ()
На словаре при прохождении в нужный ключ вернет значение, связанное с этим ключом, или Нет
Если ключ нет. Этот метод позволяет нам изменять пример 1 во что-то немного меньше хаки.
# Example 2 s = 'Hello World!' counts = {} for char in s: if counts.get(char): counts[char] += 1 else: counts[char] = 1
Это просто чувствует себя лучше, чтобы посмотреть, верно? Нет ошибок на этом горизонте!
Теперь, если словарь не содержит ключ, по умолчанию Нет
возвращается. С Нет
считается ЛОЖЬ код в пределах Если
пункт не выполнен, и мы переходим в еще
пункт назначить начальное значение для данного ключа.
Будьте осторожны при использовании .получать ()
В логике, хотя, если значение, связанное с ключом, равно 0, то также считается Falsey и код внутри Если
пункт не будет выполнен. Это не будет иметь значение с этим конкретным примером, но он может в других сценариях. В этих случаях я бы предложил бы что-то вдоль линий Если counts.get (char):
Чтобы проверить, если значение связано с ключом, является чем-то, кроме Нет
Отказ
🤔 Хм, но пример 2, похоже, не имеет меньшего количества строк кода, чем пример 1. Ну, есть больше доброта, спрятанного в .получать ()
. Этот метод также принимает дополнительный второй аргумент, который определяет значение возврата по умолчанию. Не удовлетворен Нет
? Тогда давайте сделаем что-то об этом!
# Example 3 s = 'Hello World!' counts = {} for char in s: counts[char] = counts.get(char, 0) + 1
Это прекрасно!
Много происходит на этой последней линии. .получать ()
Способ проверяет словарь для данного ключа и возвращает либо значение, связанное с ключом, либо значением возвращаемого по умолчанию, которое мы указали в качестве второго аргумента, 0. Мы добавляем 1 к тому, что возвращается из .получать ()
, назначить сумму в качестве значения для ключа и вызовите его в день.
Приведенные выше примеры имели дело с простой сценарием подсчета но .получать ()
Может использоваться практически в любом месте, вы проверяете ключи в словаре. Если вы специально в подсчете бизнесе, я бы порекомендовал вам, чтобы вы также проглядывали на невероятных Счетчик
Класс из стандартной библиотеки Python Коллекции
модуль.
# Example 4 from collections import Counter counts = Counter('Hello World!')
Спасибо за чтение моего любовного письма к .получать ()
! Дайте мне знать, как вы использовали .получать ()
Или если вы знаете трюк Python, который вы чувствуете, что все должны охватывать.
👋
Оригинал: “https://dev.to/skybur/get-more-with-less-from-python-dictionaries-1j0p”