Это было предназначено для того, чтобы принимать любое количество входных данных (имена и отпуска), вводить их в словарь (пары значений имя: [список отпусков]) и отображать их в конце, но вместо этого в списке отпусков перечислены только две последние записи. Есть идеи, почему?
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 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!")
Спасибо, это решило это! Я сохранил += вместо добавления
Переосмысление потока вашего кода:
name
в вашем словаре. Если он существует, добавьте к списку запись этого ключа. Если он не существует, инициализируйте список/значение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!")
Вы спрашиваете дважды внутри цикла while для каждого name, поэтому ваш список для каждого ключа name будет содержать только одну или две записи. В следующем цикле more вы не запрашиваете новый name, поэтому предыдущие записи для этого ключа name будут перезаписаны на следующей итерации. Таким образом, вы непреднамеренно сохраняете только последнюю запись для каждого name, всегда перезаписывая любую предыдущую запись для этого name ключа. Вам нужно переосмыслить свою логику.