Python 更多问题';简单';杂货清单
昨天我发布了一个关于杂货清单的问题,得到了很多帮助。我遇到了另一个问题。这是我的密码:Python 更多问题';简单';杂货清单,python,python-3.x,Python,Python 3.x,昨天我发布了一个关于杂货清单的问题,得到了很多帮助。我遇到了另一个问题。这是我的密码: item = {} while True: x = input('enter item: ') if x =='done': break y = float(input('enter price: ')) item[x] = (y) slist = {} print('How much do you want of everything?') while
item = {}
while True:
x = input('enter item: ')
if x =='done':
break
y = float(input('enter price: '))
item[x] = (y)
slist = {}
print('How much do you want of everything?')
while True:
listitem = input("Item name: ")
if listitem == 'done':
break
qty = float(input("How many: "))
slist[listitem] = qty
total = 0
for key in item:
value = item[key] * slist[key]
total = total + value
print(total)
当您为第一个循环输入一个项,然后不为第二个循环输入它时,问题就出现了。例如,在第一个循环中输入:牛奶、5个鸡蛋、3个面包、2,然后在第二个循环中仅包含牛奶和鸡蛋,会导致错误:
Traceback (most recent call last):
File "V:\Downloads\grocery list.py", line 24, in <module>
value = item[key] * slist[key]
KeyError: 'Bread'
回溯(最近一次呼叫最后一次):
文件“V:\Downloads\screery list.py”,第24行,在
值=项目[键]*slist[键]
关键错误:“面包”
我能做些什么来防止这种情况发生 变化:
value = item[key] * slist[key]
致:
。因此,如果slist
不包含key
(您实际上并不需要该项),则将其视为计数为0(如果它确实包含key
,则忽略默认的0
)
或者,将您的循环翻转到购物列表(对于键入列表:
)而不是库存,并保持计算不变。在这种情况下,您需要异常;如果您的购物清单中包含不在商店中的商品,您希望查找其价格的尝试失败
旁注:对于正确性来说,这不是必需的,但是如果同时使用键和值,那么并行迭代它们会更容易,而不仅仅是迭代键,然后再查找值。它还允许您提供更多有用的名称,以便代码能够自行编写文档。循环可以更改为(例如):
避免重复查找并使意图更加清晰。而不是循环
for key in item
你应该做什么
for key in slist
因为item
包含商店中的所有商品,并且slist
仅列出购买的商品。
slist
是个坏名字,顺便说一句,它是一本字典,不是一个列表
带调整代码的演示:
enter item: Milk
enter price: 5
enter item: Eggs
enter price: 3
enter item: Bread
enter price: 2
enter item: done
How much do you want of everything?
Item name: Milk
How many: 2
Item name: Eggs
How many: 1
Item name: done
13.0
您收到此错误是因为
Bread
不是slist
字典中的键…slist
在这种特定上下文中并不可怕,因为它可能是“购物清单”的缩写。称之为“slist”会强调它的错误部分。@ShadowRanger我说的不好,不可怕。:)非常感谢,这让我在作业上省了几分。你们太棒了@JonathanLudwig没问题!在我看来,使用get
就像是围绕bug编码。没有理由对商店中的每一件商品进行循环以计算结帐价格。timgeb:是的,我刚才解释了最低限度的改变,但我同意翻转哪个dict
循环更有意义(特别是在现实世界中,购物清单上的独特物品应该是商店提供的全部物品的一小部分)。谢谢!我先尝试了另一个答案,这对我很有效,但我也照你说的做了,效果很好!谢谢你的时间!
for key in slist
enter item: Milk
enter price: 5
enter item: Eggs
enter price: 3
enter item: Bread
enter price: 2
enter item: done
How much do you want of everything?
Item name: Milk
How many: 2
Item name: Eggs
How many: 1
Item name: done
13.0