@mazimuz

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

Пользователь вводит слова, каждое с новой строки, пока не введет пустую строку. Затем должна выводить список без повторяющихся элементов.

Вопрос: Не пойму как нужно добавить в список слова

a = str(input())
b = list()
while a != '':
a = str(input())
b.append(a)
else:
print(b)
  • Вопрос задан
  • 4155 просмотров
Решения вопроса 2
sergey-gornostaev
@sergey-gornostaev Куратор тега Python
Седой и строгий
print(*{i for i in iter(input, '')})
Ответ написан
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, ''))"
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы