昨天,我发布了一个有关杂货清单的问题,并获得了很多帮助。我遇到了另一个问题。这是我的代码:
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'
我该怎么做才能防止这种情况发生?
答案 0 :(得分:1)
更改:
value = item[key] * slist[key]
收件人:
value = item[key] * slist.get(key, 0)
dict.get
is used when you want to get a value if it exists, or get a default value otherwise。这样就可以了,如果slist
不包含key
(您实际上并不想要该项目),则将其视为计数为0(如果它确实包含{{1} },默认的key
将被忽略。)
或者,翻转循环以遍历购物清单(0
)而不是清单,并保持计算不变。在这种情况下,您想要例外;如果您的购物清单中包含不在商店中的商品,则您希望尝试查找其价格失败。
旁注:对于正确性而言不是必需的,但是如果您同时使用键和值,则并行地对其进行迭代,而不是仅对键进行迭代,然后再查找值会更容易。它还可以让您提供更多有用的名称,以便代码自行记录。循环可以更改为(例如):
for key in slist:
避免重复查找并使意图更清晰。
答案 1 :(得分:1)
而不是循环
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('first_name','last_name','email','password')
def create(self, validated_data):
user = User.objects.create(
username=validated_data.get('username'),
email=validated_data.get('email')
)
user.save()
return user
def partial_update(self, request, *args, **kwargs):
kwargs['partial'] = True
return self.update(request, *args, **kwargs)
def update(self, instance, validated_data):
first_name = validated_data.pop('first_name', None)
print (first_name)
for key, value in validated_data.items():
if value != None:
setattr(instance, key, value)
instance.save()
return instance
你应该做的
for key in item
因为for key in slist
包含商店中的所有商品,而item
仅包含购买的商品。
顺便说一句,slist
是一个坏名字,它是字典,而不是列表。
演示代码已调整:
slist