Список покупок 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)
Другие вопросы по тегам