如何在while循环中追加列表而不覆盖以前的结果

时间:2019-03-31 05:54:06

标签: python

我正在为我的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))

因此,它不会保存并累加每个输入,而是仅使用输入的最后一个输入的值覆盖所有先前的输入,然后将其累加遍历循环多次。我理解为什么它会覆盖以前的值并且很有意义。我只是不知道如何在仍然输出原始输入的同时更新列表。预先感谢您的帮助!

2 个答案:

答案 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))