我正在为我的Python课程的购物清单编写脚本。一切看起来不错,除了每次我在列表中附加新的字典条目时,我都会覆盖旧值。我已经在这里找到了许多类似的问题,但是我不想承认我还不太了解很多答案。希望我自己问这个问题并了解上下文会更好地理解它。这是我的代码:
grocery_item = {}
grocery_history = []
stop = 'c'
while stop == 'c':
item_name = input('Item name:\n')
quantity = input('Quantity purchased:\n')
cost = input('Price per item:\n')
grocery_item = {'name':item_name, 'number': int(quantity), 'price':
float(cost)}
grocery_history.append(grocery_item) <<< # OVERWRITES OLD VALUES.
stop = input("Would you like to enter another item?\nType 'c' for
continue
or 'q' to quit:\n")
grand_total = 0
for items in range(0,len(grocery_history)):
item_total = grocery_item['number'] * grocery_item['price']
grand_total = grand_total + item_total
print(str(grocery_item['number']) + ' ' + str(grocery_item['name']) + '
' + '@' + ' ' + '$' + str(grocery_item['price']) + ' ' + 'ea' + ' ' +
'$' +
str(item_total))
item_total == 0
print('Grand total:$' + str(grand_total))
因此,它不会保存并累加每个输入,而是仅使用输入的最后一个输入的值覆盖所有先前的输入,然后将其累加遍历循环多次。我理解为什么它会覆盖以前的值并且很有意义。我只是不知道如何在仍然输出原始输入的同时更新列表。预先感谢您的帮助!
答案 0 :(得分:3)
您创建几个dict
对象,并分别分配到grocery_item
。每个替换该名称下的最后一个 ,这很好,因为您每个还append
到grocery_history
。但是,您永远不会使用该list
(确定要执行的总循环的迭代次数除外);取而代之的是,您再次使用grocery_item
,它仍然具有最后分配给它的单个值。
只需更换
for items in range(0,len(grocery_history)):
使用
for grocery_item in grocery_history:
(您从未使用过items
。)
答案 1 :(得分:0)
问题不在您想像的地方。值已正确附加到grocery_history
。您可以使用print(grocery_history)
检查自己。
问题出在您的for
循环中。您正在从grocery_item
(即用户输入的最后一项)中读取内容,而不是从整个grocery_history
列表中读取内容。将此循环替换为for
循环:
for i in range(0,len(grocery_history)):
item_total = grocery_history[i]['number'] * grocery_history[i]['price']
grand_total = grand_total + item_total
print(str(grocery_history[i]['number']) + ' ' + str(grocery_history[i]['number']) + ' ' + '@' + ' ' + '$' + str(grocery_history[i]['number']) + ' ' + 'ea' + ' ' + '$' + str(item_total))
item_total == 0
print('Grand total:$' + str(grand_total))