Изучая Python, решил зафиксировать эволюцию своего кода для одной и той же задачи. Задачи решаю с курса «Программирование на Python» на Stepic.org (https://stepik.org/course/67).
Критерием для оценки выступает code complexity score, который система выдает каждый раз, когда верно решаешь поставленную задачу.
Условия задачи
Когда Антон прочитал «Войну и мир», ему стало интересно, сколько слов и в каком количестве используется в этой книге.
Помогите Антону написать упрощённую версию такой программы, которая сможет подсчитать слова, разделённые пробелом и вывести получившуюся статистику.
Программа должна считывать одну строку со стандартного ввода и выводить для каждого уникального слова в этой строке число его повторений (без учёта регистра) в формате «слово количество» (см. пример вывода).
Порядок вывода слов может быть произвольным, каждое уникальное слово должно выводиться только один раз.
Sample Input 1:
a aa abC aa ac abc bcd a
Sample Output 1:
ac 1 a 2 abc 2 bcd 1 aa 2
Sample Input 2:
a A a
Sample Output 2:
a 3
Мои решения
Ниже идут варианты моих решений. Не судите строго 🙂
#1 вариант, code complexity score = 9.27
list = input().lower().split()
unique = []
for l in list:
if l not in unique: unique.append(l)
for u in unique:
print("{} {}".format(u, list.count(u)))
#2 вариант, code complexity score = 8.31
list = input().lower().split()
unique = []
for l in list:
if l not in unique:
unique.append(l)
print("{} {}".format(l, list.count(l)))
#3 вариант, code complexity score = 7.28
list = input().lower().split()
unique = set(list)
for i in unique:
print("{} {}".format(i, list.count(i)))
После использования множеств (третий вариант), решил сразу в цикле отсекать неуникальные значения. Показатель кода — 7.07, код:
list = input().lower().split()
for i in set(list):
print("{} {}".format(i, list.count(i)))
Это явно не те результаты, которые хотелось бы. Несмотря на то, что количество строк уменьшилось с 6 до 3, нужно пересмотреть свой подход к быстродействию.
Посмотрев лучшее решение, понял что люди просто нашли лайфхак :). Вот так выглядит самый эффективный вариант:

Кто-то просто нашел способ получать самое лучшее решение. Проализировав решения других понял, что мои вполне адекватные. Из интересного, решение в 2 строки:
lst = [el for el in input().lower().split()]
[print(key,value) for key,value in {el:lst.count(el) for el in lst}.items()]