• Ввод строки с добавлением в список?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    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, ''))"
    Ответ написан
    Комментировать