def task_v1():
"""
Принимает на вход строки (признак конца ввода - пустая строка),
сохраняет их в список без повторений.
Печатает сохранённые в списке строки.
"""
lst = [] # делаем пустой список
s = input() # вводим первую строку
while s: # пока введённая строка не пуста:
if s not in lst: # если строка не в списке:
lst.append(s) # добавляем её
s = input() # принимаем следующую строку
print('\n'.join(lst)) # объединяем все строки через абзац и печатаем
def task_v2():
"""
Также принимает на вход строки, но сохраняет их в Счётчик.
Счётчик и порядок добавления запоминает и считает количество повторов.
Печатает ключи счётчика.
"""
from collections import Counter # импортируем класс счётчика
c = Counter() # создаём экземпляр Счётчика
s = input() # вводим первую строку
while s: # пока введённая строка не пуста:
c[s] += 1 # подсчитываем её счётчиком
s = input() # принимаем следующую строку
print('\n'.join(c)) # объединяем ключи счётчика через абзац и печатаем
def task_v3():
"""
То же, что и v2, но в функциональном стиле
"""
from collections import Counter # импортируем класс счётчика
print( # функция печати, которой даём строку...
'\n'.join( # которую формируем объединяя через абзац элементы (строки) полученные...
Counter( # созданием экземпляра счётчика, которому в конструктор передаём...
iter(input, '') # итератор, который будет вызывать функцию input пока она не вернёт '',
# а результаты всех вызовов (кроме последнего) будет возвращать по мере
# запроса их конструктором Счётчика (для подсчёта)
).keys() # и формированием списка уникальных ключей (строк) из счётчика.
# ктсати `.keys()` совершенно не нужен. Итаратор по счётчику возвращает ключи.
)
)
def task_v3_1():
"""В одну строку это выглядит не так ужасно:"""
print('\n'.join(Counter(iter(input, ''))))
def task_v4():
"""
То же, что и v3, но расписано на этапы и сохранено в промежуточные переменные
"""
from collections import Counter # импортируем класс счётчика
it = iter(input, '') # создаём итератор, который по мере запроса у него
# очередных значений будет вызывать функцию
# input пока она не вернёт пустую строку
c = Counter(it) # создаём экземпляр Счётчика и в качестве аргумента
# даём ему наш итератор. тем самым мы предлагаем
# нашему новому счётчику запросить все значения,
# что отдаст итератор и посчитать количество
# вхождений каждой уникальной строки
unic = c.keys() # получаем у счётчика его ключи, то есть все
# уникальные строки, которые он считал.
# Приятный побочный эффект, доступный в современном
# Питоне - это сохранение порядка ключей по мере ввода.
# Этот шаг не обязателен, поскольку счётчик итерируется по ключам.
result_text = '\n'.join(unic) # объединяем все уникальные строки через абзац. Вместо unic можно просто указать `c`.
print(result_text) # и печатаем их
На баше можно совсем коротко, но порядок не сохраняется:
$ py "set(iter(input,''))"
$ cat<<""|py -l "set(l)"
Чтобы сохранялся - подлиннее получится:
$ cat<<""|py -l "collections.Counter(l)"
py "collections.Counter(iter(input, ''))"