Метод setdefault

Решал задачку и не прошло решение,но потом решил ее и вернулся, чтобы разобраться,но пока не понял до конца.

Код №1:

text = 'footballcyberpunkextraterritorialityconversationalistblockophthalmoscopicinterdependencemamauserfff'

result = {}
for i in text:
    result.setdefault(i,0) + 1
  
print(result)

В задаче надо посчитать кол-во повтора букв и в этом коде метод setdefault добавляет в словарь result одни нули каждой букве, но не прибавляет 1(ну или не учитывает, хз).

код №2:

text = 'footballcyberpunkextraterritorialityconversationalistblockophthalmoscopicinterdependencemamauserfff'

result = {}
for i in text:
    result.setdefault(i)
  
print(result)

тут в ответе у всех букв значение None.

Код №3:

text = 'footballcyberpunkextraterritorialityconversationalistblockophthalmoscopicinterdependencemamauserfff'

result = {}
for i in text:
    result.setdefault(i) + 1
  
print(result)

Тут у нас появляется ошибка "TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'" и мы узнаем, что нельзя сложить None и цифру 1,делаем вывод что цифра 1 видна, но в коде №1, она почему то не складывается с нулем.


Ответы (1 шт):

Автор решения: MBo

Можно исправить так - в данном случае результат сложения используется, а не теряется

result[i] = result.setdefault(i, 0) + 1

Но более логично написать

result[i] = result.get(i,0) + 1

На мой взгляд, легче читается с проверкой:

for i in text:
    if i in result:
        result[i] += 1
    else:
        result[i] = 1

print(result)

Можно упростить с defaultdict (указывается тип value)

from collections import defaultdict
result = defaultdict(int)
for i in text:
    result[i] += 1

Ещё проще использовать Counter:

from collections import Counter
r = Counter(text)
print(r)
→ Ссылка