Понимание метода .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
, все остальное кажется довольно простым.
Ответы
Ответ 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)
, на этот конкретный вопрос было несколько ответов - этот метод возвращает значение ключа или заданного вами значения по умолчанию. Первый аргумент - это ключ, который вы ищете, второй аргумент - по умолчанию, когда этот ключ отсутствует.