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

时间:2016-06-02 17:20:57

标签: 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],
             [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))

此代码在0€到601012.11€之间正常工作,但对于601012.12€或更高版本失败。

return fee UnboundLocalError: local variable 'fee' referenced before assignment

我认为问题在于:amount < scale[i+1][0]当i = 4时,未分配fee变量。

是否有更多pythonic方法可以选择量表的范围限制?

3 个答案:

答案 0 :(得分:1)

你不是在处理这一案件。您应该在循环外添加另一个if语句(类似于您使用的if ammount <= scale[1][0],因为循环不处理这两个范围中的值):

if ammount >= scale[len(scale) - 1][0]:
    fee = scale[len(scale) - 1][1]

顺便说一句,第一个<=的{​​{1}}与第二个if>=之间的差异不大

我怀疑我能做得比这更好:

<

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 scale[-1][0]无法执行,因此会被短路。

答案 1 :(得分:1)

我认为更好的方法是使用while循环来检查amount是否小于scale[i+1][0],这样您就可以使用scale[i][1]。并且还要给其他人处理大于scale[len(scale)][0]的任何内容。

答案 2 :(得分:0)

首先,你应该尽量避免命名不同的东西。这使问题变得更加困难。

这会发生什么:如果金额低于比例表中的第二个条目,则返回第一个条目。如果没有,则查看表格并检查金额是否大于当前值并小于下一个阈值。直到最后一个为止, [HttpGet] public object Get(string table, string columns, int id) { var splitColumns = columns.Split(','); var t = new propertyModel() { gallery = _db.PROPERTYGALLERies.Where(p => p.propertyId == id).ToList(), property = _db.PROPERTies.SingleOrDefault(p => p.id == id) }; var requestedClass = t.GetType().GetProperty(table.ToLower()).GetValue(t, null); var returnArray = new Dictionary<string, List<string>>(); var requestArray = new List<string>(); foreach (var column in splitColumns) { foreach (var field in StringProperties(requestedClass, column)) { requestArray.Add(field.Value); } } returnArray.Add(table, requestArray); return Json(returnArray, JsonRequestBehavior.AllowGet); } public IEnumerable<KeyValuePair<string, string>> StringProperties(object obj, string column) { return from p in obj.GetType().GetProperties() where p.Name == column select new KeyValuePair<string, string>(p.Name, Convert.ToString(p.GetValue(obj))); } 将产生range(0, 5),而不会到达最后一个并且中断。 在这种情况下,当您尝试返回时,未定义0, 1, 2, 3, 4,从而引发UnboundLocalError。我也会通过检查上限来修复:

fee