更多“简单”杂货清单问题

时间:2018-11-08 20:17:32

标签: 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 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'

我该怎么做才能防止这种情况发生?

2 个答案:

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