在Python中选择比例的范围限制

在Python中选择比例的范围限制,python,list,Python,List,我想根据此比例对金额收取费用: AMOUNT FEE ------- --- 0 24.04 € 6010.12 0.00450 30050.61 0.00150 60101.21 0.00100 150253.03 0.00050 601012.11 0.00030 从0欧元到6010.13欧元是24.04欧元的固定费用 我的代码: def fee(amount): scale = [[0, 24.04],

我想根据此比例对金额收取费用:

AMOUNT     FEE
-------     ---
0           24.04 €
6010.12     0.00450
30050.61    0.00150
60101.21    0.00100
150253.03   0.00050
601012.11   0.00030
从0欧元到6010.13欧元是24.04欧元的固定费用

我的代码:

def fee(amount):
    scale = [[0, 24.04],
             [6010.12, 0.00450],
             [30050.61, 0.00150],
             [60101.21, 0.00100],
             [150253.03, 0.00050],
             [601012.11, 0.00030]]
    if amount <= scale[1][0]:
        fee = scale[0][1]
    else:
        for i in range(0, 5):
            if amount >= scale[i][0] and amount < scale[i+1][0]:
                fee = amount * scale[i][1]
                break
    return fee

print(fee(601012.12))
我假设问题在这里:
amount
当I=4时,
fee
变量未赋值


有没有比python更适合选择刻度范围限制的方法?

你不会处理这种情况。您应该在循环之外添加另一个
if
语句(类似于
if amount您没有处理这一情况。您应该在循环之外添加另一个
if
语句(与
if amount类似,我认为更好的方法是使用while循环检查
amount
是否小于
scale[I+1][0]
,这样您就可以只使用
scale[I][1]
。还可以使用else来处理大于
scale[len(scale)][0]的任何内容

我认为更好的方法是使用while循环检查
数量是否小于
比例[I+1][0]
,这样您就可以只使用
比例[I][1]
。还可以使用else来处理大于
比例[len(比例)][0]的任何事情

首先,你应该尽量避免将不同的东西命名为同一个名称。这会让你更难发现问题所在

发生的情况是:如果金额低于比例表中的第二个条目,则返回第一个条目。如果没有,则查看表格并检查金额是否大于当前值且小于下一个阈值。这一直持续到最后一个阈值,即
范围(0,5)
将产生
0,1,2,3,4
,未到达最后一个并中断。 在这种情况下,当您尝试返回它时,不会定义任何
费用
,这会引发UnboundLocalError。我也会通过检查上限来修复:

def fee(amount):
    scale = [[0, 24.04],
             [6010.12, 0.00450],
             [30050.61, 0.00150],
             [60101.21, 0.00100],
             [150253.03, 0.00050],
             [601012.11, 0.00030]]
    if amount <= scale[1][0]:
        return scale[0][1]
    elif amount >= scale[-1][0]:
        return scale[-1][1]
    else:
        for i in range(0, 5):
            if amount >= scale[i][0] and amount < scale[i + 1][0]:
                return amount * scale[i][1]
def费用(金额):
比例=[[0,24.04],
[6010.12, 0.00450],
[30050.61, 0.00150],
[60101.21, 0.00100],
[150253.03, 0.00050],
[601012.11, 0.00030]]
如果金额=比例[-1][0]:
返回量表[-1][1]
其他:
对于范围(0,5)内的i:
如果金额>=比例[i][0]和金额<比例[i+1][0]:
退货金额*比例[i][1]

首先,你应该尽量避免将不同的东西命名为同一个名称。这会让你更难看清问题所在

发生的情况是:如果金额低于比例表中的第二个条目,则返回第一个条目。如果没有,则查看表格并检查金额是否大于当前值且小于下一个阈值。这一直持续到最后一个阈值,即
范围(0,5)
将产生
0,1,2,3,4
,未到达最后一个并中断。 在这种情况下,当您尝试返回它时,不会定义任何
费用
,这会引发UnboundLocalError。我也会通过检查上限来修复:

def fee(amount):
    scale = [[0, 24.04],
             [6010.12, 0.00450],
             [30050.61, 0.00150],
             [60101.21, 0.00100],
             [150253.03, 0.00050],
             [601012.11, 0.00030]]
    if amount <= scale[1][0]:
        return scale[0][1]
    elif amount >= scale[-1][0]:
        return scale[-1][1]
    else:
        for i in range(0, 5):
            if amount >= scale[i][0] and amount < scale[i + 1][0]:
                return amount * scale[i][1]
def费用(金额):
比例=[[0,24.04],
[6010.12, 0.00450],
[30050.61, 0.00150],
[60101.21, 0.00100],
[150253.03, 0.00050],
[601012.11, 0.00030]]
如果金额=比例[-1][0]:
返回量表[-1][1]
其他:
对于范围(0,5)内的i:
如果金额>=比例[i][0]和金额<比例[i+1][0]:
退货金额*比例[i][1]

看起来您在混合比例列表的两种不同语义。在代码中,您将列表视为一系列间隔。这意味着,低于
0
和高于
601012.11
的值未定义。但从您的描述来看,您希望列表中输入值为sti的最高条目ll位于条目对的第一个元素上方。看起来您在混合比例列表的两种不同语义。在代码中,您将列表视为一系列间隔。这意味着,未定义
0
以下和
601012.11
以上的值。但从您的描述来看,您似乎希望从中获得最高的条目输入值仍然位于条目对的第一个元素之上的列表。但实际上,正如@logicStuff所提到的,这不是非常pythonic的。但是,正如@logicStuff所提到的,这不是非常pythonic的。
for i in range(-1, len(scale) - 1):
    if((i == -1 or ammount >= scale[i][0]) and
       (i == len(scale) or ammount < scale[i + 1][0])):
        fee = ammount * scale[i][1]
        return fee
def fee(amount):
    scale = [[0, 24.04],
             [6010.12, 0.00450],
             [30050.61, 0.00150],
             [60101.21, 0.00100],
             [150253.03, 0.00050],
             [601012.11, 0.00030]]
    if amount <= scale[1][0]:
        return scale[0][1]
    elif amount >= scale[-1][0]:
        return scale[-1][1]
    else:
        for i in range(0, 5):
            if amount >= scale[i][0] and amount < scale[i + 1][0]:
                return amount * scale[i][1]