Просто для полноты, если вы хотите сделать это, не используя Counter
, вот еще один очень короткий путь, используя понимание списка и встроенное dict
:
from string import ascii_lowercase as letters
with open("text.txt") as f:
text = f.read().lower()
print dict((l, text.count(l)) for l in letters)
f.read()
прочитает содержимое всего файла в переменной text
(может быть, плохая идея, если файл действительно большой); то мы используем понимание списка для создания списка кортежей (letter, count in text)
и конвертируем этот список кортежей в словарь. С помощью Python 2.7+ вы также можете использовать {l: text.count(l) for l in letters}
, который еще короче и немного читабельнее.
Обратите внимание, однако, что это будет искать текст несколько раз, один раз для каждой буквы, тогда как Counter
сканирует его только один раз и обновляет подсчеты для всех букв за один раз.
Как уже упоминалось в комментариях, я думаю, что лучший подход - это «надеяться на лучшее».
Пользователь ожидает, что при нажатии кнопки со звездочкой проблем не будет, поэтому выполнение каких-либо действий, кроме зажигания звезды, будет тревожным для пользователя. Конечно, вам нужно проверить звезду на вашем бэкэнде, но в то же время вы будете предполагать, что она будет успешной, и зажечь звезду.
Когда запрос был выполнен, предполагая, что все работало и звезда была действительной, пользователь ничего не замечал, и взаимодействие работало так, как он ожидал.
Если запрос заканчивается, и звездочка по какой-то причине оказалась недействительной, вам придется отобразить сообщение об ошибке определенного типа и отменить пометку элемента.
Я думаю, что концепция, которая может быть полезна здесь, это «оптимистичный интерфейс». Это шаблон, обычно используемый для того, что вы описываете, чтобы поддерживать тесную обратную связь с пользователем, указывая ему, что его действие что-то сделало, предполагая положительный результат, когда что-то (например, HTTP-запрос) выполняется асинхронно, и если есть ошибки, вы можете вернуть положительное состояние и предупредить пользователя о проблеме.
На практике в React, если вы используете что-то вроде Redux, вы можете создать некое «архивное» действие, которое устанавливает состояние для каждого выбранного элемента как «заархивированное» в редукторе, и в то же время снимать запрос к бэкэнду обновить сервер с архивным состоянием. Предполагая, что вы используете async/await
для создания запроса к серверу, вы можете заключить его в try/catch
, где catch
обнаруживает неудавшийся запрос и восстанавливает «заархивированное» состояние выбранных элементов в редукторе и, возможно, показывает ошибку сообщение пользователю.