Почему KeyError повышает, даже если соответствующий ключ существует? - PullRequest
0 голосов
/ 18 января 2020
def countLetter(string):
    dic = dict()
    for char in string:
        dic[char] = (1,dic[char]+1)[char in dic]
    print(dic)
countLetter('aabcb')

Здесь я пытаюсь подсчитать, сколько раз встречалась каждая буква, но в строке 4 возникает ошибка. Это поднимает KeyError .

1 Ответ

3 голосов
/ 18 января 2020

Проблема в том, что эта строка:

dic[char] = (1,dic[char]+1)[char in dic]

равна с нетерпением , оценивая dic[char]+1 как часть построения tuple для индексации до , которую вы получите до проверки, если char in dic, чтобы выбрать элемент tuple. Таким образом, он умирает с KeyError до того, как ваш тест сможет предотвратить неудачный поиск. Чтобы сделать это ленивым, вы можете сделать:

dic[char] = dic[char] + 1 if char in dic else 1

или просто использовать метод, разработанный для этого , чтобы избежать явного теста:

dic[char] = dic.get(char, 0) + 1

Хотя этот конкретный шаблон стал еще проще с collections.Counter:

import collections

def countLetter(string):
    print(collections.Counter(string))  # print(dict(collections.Counter(string))) if it must look like a dict
...