1

我需要找到订单的折扣我使用以下代码将订单号的字符串输入到字典中,然后使用 sum() 来查找订单的总数但是如果有一个,我希望有一个优惠折扣- 1 and one-3 and (one-4 or one-5 or one-6) 但是在条件块之后,当我想将它相乘时,我收到一个未绑定错误

def compute_cost(order):
"""
    Function 2: compute_cost(order)
    Parameters: order (String)
    Return: Final cost of order
"""
numcount = {}
orderlist = map(int, order)
for i in orderlist:
    if numcount.get(i):
        numcount[i] += 1
    else:
        numcount[i] = 1
for i in numcount:
    if i == 1:
        numcount[i] = numcount[i]*4.25
    elif i == 2:
        numcount[i] = numcount[i]*2.50
    elif i == 3:
        numcount[i] = numcount[i]*2.00
    elif i == 4:
        numcount[i] = numcount[i]*1.25
    elif i == 5:
        numcount[i] = numcount[i]*1.50
    elif i == 6:
        numcount[i] = numcount[i]*1.75
    elif i == 7:
        numcount[i] = numcount[i]*3.75
    else:
        return print("Your order has a number outside of the range (1:7)")
    order_total = sum(numcount.values())
    if(numcount[1] == 1 and
       numcount[3] == 1 and
       (numcount[4] == 1 or
       numcount[5] == 1 or
       numcount[6] == 1)):
        discount1 = 0.20
    order_total1 = order_total*discount1
return order_total1

请帮助我谢谢您的时间和精力

编辑 如果您有更好的方法让我找到值并将它们保存在字典中,我也愿意接受建设性的批评

4

1 回答 1

0

根据输入,numcount-dict 可能有也可能没有所有的键。

案例一:UnboundLocalError

使用 调用函数时compute_cost('12323123')numcount-dict 变为:

{1: 2, 2: 3, 3: 3}

if 语句首先检查 if numcount[1] == 1,结果为False。因此,整个表达式为False,Python 甚至不需要(需要)检查其余部分。(这称为短路评估。)

因为 if 语句的计算结果为Falsediscount1所以根本没有设置,所以你得到UnboundLocalError: local variable 'discount1' referenced before assignment.

解决方案:当条件为False时, 添加一个设置discount1为 1(= 无折扣)的 else 子句:

if (numcount[1] == 1 and numcount[3] == 1 and (numcount[4] == 1 or
    numcount[5] == 1 or numcount[6] == 1)):
    discount1 = 0.20
else:
    discount1 = 1

案例 2:KeyError

现在,当使用 调用函数时compute_cost('32235664')numcount-dict 变为:

{3: 2, 2: 2, 5: 1, 6: 2, 4: 1}

if 语句首先检查 if numcount[1] == 1,但该键不存在,因此 Python 引发了KeyError. 根据您的输入以及 Python 需要评估 - 语句的if程度,您可能会得到KeyError或没有得到。

解决方案: 确保numcount-dict 从头开始​​包含所有键。您已经知道 dict 必须有多少项目,因为您将输入限制在范围 (1:7) 内。因此,您可以将 dict 初始化为:

numcount = {1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0}

编辑:有更好的方法吗?

当然有,几乎总是有更好的方法:

prices = {'1':4.25, '2':2.50, '3':2.00, '4':1.25, '5':1.50, '6':1.75, '7':3.75}
orders = '12323456'

total = sum(prices[order] for order in orders)
if (all(orders.count(type) >= 1 for type in '13') and           # multiple ANDs with 'all'
    any(True for type in '456' if orders.count(type) >=1)):     # multiple ORs with 'any'
    discount = 0.2
else:
    discount = 1
print('Order value: {}\nDiscount: {}\nOffer: {:.2f}'.format(total, discount, discount * total))

您现在可以轻松扩展您的价格字典或折扣条件。我假设折扣的条件是 至少订购了一件商品,而不是一件。因此,我使用了它,如果它需要完全是>=1一个,你可以将其更改为。==1

于 2020-07-22T22:17:16.353 回答