Подтвердить что ты не робот

Понимание метода .get() в Python

sentence = "The quick brown fox jumped over the lazy dog."
characters = {}

for character in sentence:
    characters[character] = characters.get(character, 0) + 1 

print(characters)

Я не понимаю, что делает characters.get(character, 0) + 1, все остальное кажется довольно простым.

4b9b3361

Ответ 1

Метод ttt get (например, characters работает так же, как индексирование dict, за исключением того, что если ключ отсутствует, вместо повышения KeyError он возвращает значение по умолчанию (если вы вызываете .get с одним аргументом, ключ, значение по умолчанию None).

Итак, эквивалентная функция Python (где вызов myget(d, k, v) аналогичен d.get(k, v) может быть:

def myget(d, k, v=None):
  try: return d[k]
  except KeyError: return v

Пример кода в вашем Q явно пытается подсчитать количество вхождений каждого символа: если он уже имеет счетчик для заданного символа, get возвращает его (поэтому он просто увеличивается на единицу), else get возвращает 0 (поэтому приращение правильно дает 1 при первом вводе символа в строке).

Ответ 2

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

Помните, что мы начинаем с пустого слова символов

characters = {}

Я выберу букву "е". Пропустите символ "e" (найденный в слове The) в первый раз через цикл. Я предполагаю, что первый символ пройдет через цикл, и я заменим переменные своими значениями:

for 'e' in "The quick brown fox jumped over the lazy dog.":
    {}['e'] = {}.get('e', 0) + 1 

characters.get('e', 0) сообщает python о поиске ключа 'e' в словаре. Если он не найден, он возвращает 0. Так как это первый случай, когда "e" передается через цикл, символ "e" еще не найден в словаре, поэтому метод get возвращает 0. Это значение 0 затем добавляется к 1 (присутствует в символе [character] = characters.get(character, 0) + 1). После завершения первого цикла с использованием символа "e" теперь мы имеем запись в словаре следующим образом: {'e': 1}

Теперь словарь:

characters = {'e': 1}

Теперь перейдем ко второму 'e' (найденному в слове, прыгнутому) через тот же цикл. Я предполагаю, что второй символ пройдет через цикл, и я обновлю переменные новыми значениями:

for 'e' in "The quick brown fox jumped over the lazy dog.":
    {'e': 1}['e'] = {'e': 1}.get('e', 0) + 1

Здесь метод get находит ключевую запись для "e" и находит ее значение, равное 1. Мы добавляем это к другому 1 в characters.get(character, 0) + 1 и получаем результат 2.

Когда мы применяем это в символах [character] = characters.get(символ, 0) + 1 уравнение:

characters['e'] = 2

Должно быть ясно, что последнее уравнение присваивает новое значение 2 уже имеющемуся "e" ключу. Поэтому словарь теперь:

characters = {'e': 2}

Ответ 3

Начать здесь http://docs.python.org/tutorial/datastructures.html#dictionaries

Затем здесь http://docs.python.org/library/stdtypes.html#mapping-types-dict

Затем здесь http://docs.python.org/library/stdtypes.html#dict.get

characters.get( key, default )

key is a character

default is 0

Если символ находится в словаре, characters, вы получаете объект словаря.

Если нет, вы получите 0.


Синтаксис:

get(key[, default])

Возвращает значение для ключа, если ключ находится в словаре, иначе по умолчанию. Если значение по умолчанию не задано, оно по умолчанию равно None, поэтому этот метод никогда не вызывает KeyError.

Ответ 4

Если d - словарь, тогда d.get(k, v) означает, дайте мне значение k в d, если k не существует, и в этом случае дайте мне v. Он используется здесь для получения текущего счета символа, который должен начинаться с 0, если символ ранее не встречался.

Ответ 5

Я вижу, что это довольно старый вопрос, но это выглядит как один из тех случаев, когда что-то было написано без знания языка. Для выполнения этих целей существует библиотека collections.

from collections import Counter
letter_counter = Counter()
for letter in 'The quick brown fox jumps over the lazy dog':
    letter_counter[letter] += 1

>>> letter_counter
Counter({' ': 8, 'o': 4, 'e': 3, 'h': 2, 'r': 2, 'u': 2, 'T': 1, 'a': 1, 'c': 1, 'b': 1, 'd': 1, 'g': 1, 'f': 1, 'i': 1, 'k': 1, 'j': 1, 'm': 1, 'l': 1, 'n': 1, 'q': 1, 'p': 1, 's': 1, 't': 1, 'w': 1, 'v': 1, 'y': 1, 'x': 1, 'z': 1})

В этом примере пробелы подсчитываются, очевидно, но независимо от того, хотите ли вы, чтобы эти отфильтрованные были до вас.

Что касается dict.get(a_key, default_value), на этот конкретный вопрос было несколько ответов - этот метод возвращает значение ключа или заданного вами значения по умолчанию. Первый аргумент - это ключ, который вы ищете, второй аргумент - по умолчанию, когда этот ключ отсутствует.