Почему эта программа на Python перечисляет только два последних ввода, а не все?

Это было предназначено для того, чтобы принимать любое количество входных данных (имена и отпуска), вводить их в словарь (пары значений имя: [список отпусков]) и отображать их в конце, но вместо этого в списке отпусков перечислены только две последние записи. Есть идеи, почему?

dreams = {}

open = True

while open:
    print('Hi and welcome to the "Dream Vacation poll"')
    more = True
    name = input('What is your name? ')
    while more:
        location = input('What is your dream vacation location or country? ')
        dreams[name] = [location]
        response_more = input('Would you like to add more locations? (yes/no) ')
        if response_more == 'no':
            more = False
        else:
            location = input('What is your other dream vacation location or country? ')
            dreams[name] += [location]
            response_more = input('Would you like to add more locations? (yes/no) ')
            if response_more == 'no':
                more = False
    response_open = input('Are there more people taking the poll before it closes? (yes/no) ')
    if response_open == 'no':
        open = False

for name, locations in dreams.items():
    if len(locations) > 1:
        print(f"\n{name.title()}'s dream vacations are: ")
        for location in locations:
            print(location)
    else:
        print(f"\n{name.title()}'s dream vacation is: ")
        for location in locations:
            print(location)

print("\nThank you for participating in the poll!")

Вы спрашиваете дважды внутри цикла while для каждого name, поэтому ваш список для каждого ключа name будет содержать только одну или две записи. В следующем цикле more вы не запрашиваете новый name, поэтому предыдущие записи для этого ключа name будут перезаписаны на следующей итерации. Таким образом, вы непреднамеренно сохраняете только последнюю запись для каждого name, всегда перезаписывая любую предыдущую запись для этого name ключа. Вам нужно переосмыслить свою логику.

JNevill 10.01.2023 15:50
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Веб-скрейпинг, как мы все знаем, это дисциплина, которая развивается с течением времени. Появляются все более сложные средства борьбы с ботами, а...
Библиотека для работы с мороженым
Библиотека для работы с мороженым
Лично я попрощался с операторами print() в python. Без шуток.
Эмиссия счетов-фактур с помощью Telegram - Python RPA (BotCity)
Эмиссия счетов-фактур с помощью Telegram - Python RPA (BotCity)
Привет, люди RPA, это снова я и я несу подарки! В очередном моем приключении о том, как создавать ботов для облегчения рутины. Вот, думаю, стоит...
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
Учебник по веб-скрапингу
Учебник по веб-скрапингу
Привет, ребята... В этот раз мы поговорим о веб-скрейпинге. Целью этого обсуждения будет узнать и понять, что такое веб-скрейпинг, а также узнать, как...
Тонкая настройка GPT-3 с помощью Anaconda
Тонкая настройка GPT-3 с помощью Anaconda
Зарегистрируйте аккаунт Open ai, а затем получите ключ API ниже.
0
1
50
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Проблема была в цикле while more. На каждой итерации цикла вы устанавливаете значение для dreams[more] = [location], которое просто устанавливает значение, а не добавляет. Таким образом, вам нужно сначала инициализировать пару ключ-значение, а затем, если пользователь хочет что-то добавить, запустить цикл и использовать dreams[name].append(location).

open = True
dreams = {}
while open:
    print('Hi and welcome to the "Dream Vacation poll"')
    more = True
    name = input('What is your name? ')
    location = input('What is your dream vacation location or country? ')
    dreams[name] = [location]
    response_more = input('Would you like to add more locations? (yes/no) ')
    if response_more == 'no':
        more = False
    while more:
        location = input('What is your other dream vacation location or country? ')
        dreams[name].append(location)
        response_more = input('Would you like to add more locations? (yes/no) ')
        if response_more == 'no':
            more = False
    response_open = input('Are there more people taking the poll before it closes? (yes/no) ')
    if response_open == 'no':
        open = False

for name, locations in dreams.items():
    if len(locations) > 1:
        print(f"\n{name.title()}'s dream vacations are: ")
        for location in locations:
            print(location)
    else:
        print(f"\n{name.title()}'s dream vacation is: ")
        for location in locations:
            print(location)
    

print("\nThank you for participating in the poll!")

Спасибо, это решило это! Я сохранил += вместо добавления

Glogg 10.01.2023 16:24

Переосмысление потока вашего кода:

  1. Проверьте, существует ли ключ /name в вашем словаре. Если он существует, добавьте к списку запись этого ключа. Если он не существует, инициализируйте список/значение
  2. Приветствуйте человека в опросе в начале программы, а не внутри вашего цикла
  3. Вместо того, чтобы повторять одно и то же приглашение дважды, просто задайте его один раз в каждом цикле. Это более косметическое решение, но оно также делает ваш код более удобным для поддержки. Вам нужно всего лишь изменить фразу подсказки в одном месте.

dreams = {}

print('Hi and welcome to the "Dream Vacation poll"')
while True:

    name = input('What is your name? ')

    while True:
        
        location = input('What is your dream vacation location or country? ')
        
        #check to see if the key exists, if not then initiate the locations list. If it does, then append to the existing entry/list
        if dreams.get(name) == None:
            dreams[name] = [location]
        else:
            dreams[name].append(location)
        
        response_more = input('Would you like to add more locations? (yes/no) ')
        if response_more == 'no':
            break        
    
    response_open = input('Are there more people taking the poll before it closes? (yes/no) ')
    if response_open == 'no':
        break

for name, locations in dreams.items():
    if len(locations) > 1:
        print(f"\n{name.title()}'s dream vacations are: ")
        for location in locations:
            print(location)
    else:
        print(f"\n{name.title()}'s dream vacation is: ")
        for location in locations:
            print(location)

print("\nThank you for participating in the poll!")

Я сделал 2 изменения. Обозначается #CHANGE 1 и #CHANGE 2 Ваша фактическая проблема заключалась в инициализации dreams[name] = [location] вот так. Когда цикл начнется снова, ваши предыдущие местоположения будут удалены, а текущий массив местоположений будет содержать только 1 элемент. Так что начинайте менять этот код на dreams[name] += [location] . Другое изменение сделано из-за изменения 2. Я использовал += для изменения 2, и это означает, что должен был быть какой-то массив (может быть пустым) для конкатенации. Итак, при изменении 1 я инициализировал dreams[name] = [] пустым массивом.

dreams = {}

open = True

while open:
    print('Hi and welcome to the "Dream Vacation poll"')
    more = True
    name = input('What is your name? ')
    dreams[name] = [] # CHANGE 1
    while more:
        location = input('What is your dream vacation location or country? ')
        dreams[name] += [location] # CHANGE 2
        print(1, dreams)
        response_more = input('Would you like to add more locations? (yes/no) ')
        if response_more == 'no':
            more = False
        else:
            location = input('What is your other dream vacation location or country? ')
            dreams[name] += [location]
            print(2, dreams)
            response_more = input('Would you like to add more locations? (yes/no) ')
            if response_more == 'no':
                more = False
    response_open = input('Are there more people taking the poll before it closes? (yes/no) ')
    if response_open == 'no':
        open = False

for name, locations in dreams.items():
    if len(locations) > 1:
        print(f"\n{name.title()}'s dream vacations are: ")
        for location in locations:
            print(location)
    else:
        print(f"\n{name.title()}'s dream vacation is: ")
        for location in locations:
            print(location)

print("\nThank you for participating in the poll!")

Другие вопросы по теме