#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()
вернет второй параметр, значение по умолчанию, которое в данном случае является пустым списком.