Рубрики
Software

Решение элементарной задачи на Python

Изучая 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, нужно пересмотреть свой подход к быстродействию.  

Посмотрев лучшее решение, понял что люди просто нашли лайфхак :). Вот так выглядит самый эффективный вариант:

Решение элементарной задачи на Python

Кто-то просто нашел способ получать самое лучшее решение. Проализировав решения других понял, что мои вполне адекватные. Из интересного, решение в 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()]