如何使用字典替换long if else块?

时间:2018-04-04 03:08:30

标签: python python-3.x

我正在为2017年编写一个所得税计算器。现在计算联邦税,我有一个很长的if else块:

def taxes(income):
    """Calculate income tax brackets from 10% to 39.6%"""
    if 0 < income <= 9325:
        return income * 0.1
    elif income <= 37950:
        return 932.5 + .15 * (income - 9325)
    elif income <= 91900:
        return 5226.25 + .25 * (income - 37950)
    elif income <= 191650:
        return 18713.75 + .28 * (income - 91900)
    elif income <= 416700:
        return 46643.75 + .33 * (income - 191650)
    elif income <= 418400:
        return 120910.25 + .35 * (income - 416700)
    else:
        return 121505.25 + .396 * (income - 418400)

我在其他一些帖子中发现,我可以使用字典直接使用dict.get(key, default)来访问值。但就我而言,由于我在一系列税级中比较income并对收入进行计算,因此情况略有不同。有没有办法让我使用字典来模拟if else块?

2 个答案:

答案 0 :(得分:2)

通过在if-else语句中使用lambda函数和阈值,您可以执行以下操作:

TAX_DICT = {
    0:        lambda income: income * 0.1,
    9325:     lambda income: 932.5 + .15 * (income - 9325),
    37950:    lambda income: 5226.25 + .25 * (income - 37950),
    91900:    lambda income: 18713.75 + .28 * (income - 91900),
    191650:   lambda income: 46643.75 + .33 * (income - 191650),
    416700:   lambda income: 120910.25 + .35 * (income - 416700),
    418400:   lambda income: 121505.25 + .396 * (income - 418400)
}

def taxes(income):
    for threshold in sorted(TAX_DICT)[::-1]:
        if income >= threshold:
            return TAX_DICT[threshold](income)

您还可以为每个阈值而不是lambda函数创建常规函数。

答案 1 :(得分:1)

字典通过获取值可能具有的所有可能的哈希码并将它们分成桶来工作。当你想要查找某些内容时,请将其哈希,检查相应的存储桶,看看是否存在某些内容。

这种方法在这里不起作用,因为如果你查找100,000这样的数字,字典就不会知道特别是在91,900的哈希值下。

对于此类问题,您需要的是可以执行二进制搜索的有序元组集合。如果列表将在运行时更改,则应该是某种自平衡二叉树;如果没有,它可以只是一个预先排序的数组。

在你的情况下,因为只有少数项目,进行二元搜索可能比它的价值更麻烦;只是走过名单应该没问题。