Как добавить значения в список в словаре при использовании цикла while?

#python #list #dictionary #while-loop #append

#python #Список #словарь #цикл while #добавить

Вопрос:

 vacation_poll = {}

name_prompt = "nWhat is your name? "
vacation_spot_prompt = "nWhere would you like to go on vacation? "
repeat_prompt = "nWould you like to continue? (yes/no) "

active = True
while active:
    name = input(name_prompt)
    vacation_spot = input(vacation_spot_prompt)
    vacation_poll[name] = [vacation_spot]
    repeat = input(repeat_prompt)
    if repeat == 'no':
        active = False

for name, spots in vacation_poll.items():
    print("nThese are "   name.title()   "'s places of interest: ")
    for spot in spots:
        print("t"   spot.title())

print(vacation_poll)
  

Моя цель — добавить новое место отдыха в список внутри словаря vacation_poll, когда появится тот же ключ. Итак, если Джо появится снова после того, как я продолжу цикл, новое место отдыха должно быть добавлено в список мест отдыха Джо, но вместо этого я перезаписываю его. Я пытался добавить с помощью цикла for, но это тоже не сработало. Как я мог бы исправить это, чтобы добавлять новое значение в список каждый раз, когда цикл продолжается?

Ответ №1:

Вы думали о схеме, которую хотели бы использовать для словаря? Судя по вашему коду, вы пытаетесь сделать что-то вроде

 vacation_poll = {
    'Bob': ['Fiji', 'Florida', 'Japan'],
    'Joe': ['Disney Land', 'Six Flags', 'Lego Land']
}
  

Когда я сталкиваюсь с такого рода проблемами, обычно я задаю оператор if, чтобы проверить, существует ли ключ в словаре, и если это не так, я инициализирую его списком:

 if name not in vacation_poll:
    vacation_poll[name] = []
  

Это позволяет мне не беспокоиться о том, что список еще не существовал позже в моем коде, и я мог бы сделать что-то вроде

 vacation_poll[name].append(vacation_spot)
  

потому что после того, как я инициализировал значение, связанное с name , как список, я могу рассчитывать на наличие списка.

В вашем случае вы могли бы рассмотреть возможность использования set вместо list, поскольку это заставляет сохранять только уникальные значения. Таким образом, если пользователь дважды введет одно и то же значение, оно будет записано только один раз, даже после повторной вставки во второй раз.

Комментарии:

1. Я только что попробовал это, так как это то, что я хотел бы сделать, но я получаю сообщение об ошибке: «TabError: непоследовательное использование табуляций и пробелов в отступах» vacation_poll = {} active = True при активности: name = input(name_prompt) vacation_spot = input (vacation_spot_prompt), если имени нет в vacation_poll: vacation_poll[name] = [] vacation_poll[name].добавить ( vacation_spot) repeat = ввод (repeat_prompt) если repeat == ‘no’: active = False, может быть, я ввел это неправильно? Мне пришлось вырезать часть кода, чтобы ответить вам.

2. Python ожидает, что все отступы будут выполняться либо с помощью табуляции, либо с пробелами (часто с 4 пробелами). Если некоторые отступы выполняются с помощью табуляций, а некоторые — с пробелами (например, код, который вы скопировали из stack overflow), то python запутается. Если вы используете редактор, подобный notepad или Visual studio code, или что-то в этом роде, у них часто будет пункт меню, который преобразует все отступы либо только в табуляции, либо только в пробелы.

Ответ №2:

Вам нужно использовать форму добавления к списку. Однако вы не можете просто использовать одно из следующих:

 vacation_poll[name] =[vacation_spot]
vacation_poll[name].append(vacation_spot)
  

Выполнение этого приведет к ошибке, потому что при добавлении первого места отдыха пользователя значение, индексируемое по его имени в словаре, отсутствует. Вместо этого нужен get(index, default) метод.

 vacation_poll[name]=vacation_poll.get(name, []) [vacation_spot]
  

Это будет сделано по желанию. Когда ключа еще нет в словаре, get() вернет второй параметр, значение по умолчанию, которое в данном случае является пустым списком.