Рубрики
Без рубрики

.получать () Больше с меньшей из словарей Python

Я недавно начал волонтерство помочь принять несколько ночлений тренировок на собеседование для местного виша Сиэтла … Помечено Python, Dict, словарь.

Недавно я начал волонтерство помочь принять несколько ночлений практики интервью для местной группы 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”