Список покупок Python Python 3 Codio Challenge
Поэтому я ищу способ добавить отдельные элементы в список в виде отдельных словарей, которые содержат название, цену и количество продуктового элемента. Я начал программировать всего несколько недель назад, поэтому, пожалуйста, прости мой ужасный код и ошибки новичка.
grocery_item = dict()
current_item = dict()
grocery_history = []
choice = 0
stop = True
while stop == True:
current_item['name'] = str(input('Item name: '))
current_item['quantity'] = int(input('Amount purchased: '))
current_item['cost'] = float(input('Price per item: '))
grocery_history.append(current_item)
choice = str(input('Press c to continue or q to quit'))
if choice == 'c':
stop = True
else:
stop = False
print(grocery_history)
Когда я вводю информацию о двух элементах (например, спам и яйца), я получаю следующий вывод:
[{'name': 'Eggs', 'quantity': 12, 'cost': 1.5}, {'name': 'Eggs', 'quantity':
12, 'cost': 1.5}]
Вместо создания двух разных элементов вывод просто повторяет самый последний, который я ввел. Я делаю некоторые основные семантические ошибки, и я не могу понять, как заполнить список "grocery_history" различными элементами из цикла ввода пользователя. Я пытался использовать pythontutor.com за помощь, но меня просто ругали за глупость. Любая помощь приветствуется.
3 ответа
Попробуйте сделать это:
grocery_item = dict()
grocery_history = []
choice = 0
stop = True
while stop == True:
current_item = dict()
current_item['name'] = str(input('Item name: '))
current_item['quantity'] = int(input('Amount purchased: '))
current_item['cost'] = float(input('Price per item: '))
grocery_history.append(current_item)
choice = str(input('Press c to continue or q to quit'))
if choice == 'c':
stop = True
else:
stop = False
print(grocery_history)
Создавая новый словарь в каждом цикле, вы избежите повторяющейся ошибки, которую видите.
Вы должны переместить current_item
словарь в while
, например:
while True:
current_item = {}
# accepts user inputs here
grocery_history.append(current_item)
choice = str(input('Press c to continue or q to quit'))
if choice != 'c':
break
Некоторые другие заметки:
- Нет необходимости инициировать
choice = 0
перед петлей. - использование
break
как можно скорее остановить цикл, не возвращаясь, чтобы снова проверить состояние
Вы получаете это, потому что словари в Python являются изменяемыми объектами: это означает, что вы можете изменить их поля, не создавая совершенно новый.
Перейдите по этой ссылке, если вы хотите глубже понять, каковы основные различия между изменяемыми и неизменяемыми объектами.
Это ваш код немного изменен и работает:
grocery_history = []
while True:
name = input('Item name: ').strip()
quantity = int(input('Amount purchased: '))
cost = float(input('Price per item: '))
current_item = {'name':name, 'quantity':quantity, 'cost':cost}
grocery_history.append(current_item)
choice = str(input('Press c to continue or q to quit: '))
if choice == 'q':
break
print(grocery_history)