Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 更多问题';简单';杂货清单_Python_Python 3.x - Fatal编程技术网

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