Python 计算受阈值约束的成本的有效方法是什么

Python 计算受阈值约束的成本的有效方法是什么,python,Python,我想计算受某些阈值约束的家庭的水费成本: 基本上,阈值如下所示: 对于第一个0-10 m3,成本为10美元 对于随后的11-20 m3,将花费20美元 对于随后的21-30 m3,将花费30美元 对于随后的>30 m3,将花费40美元 例如,如果一个家庭使用40 m3的水,将收取以下费用: (10*10)+(10*20)+(10*30)+(10*40)=1000美元 如果一个家庭使用23 m3的水,将收取以下费用: (10*10)+(10*20)+(3*30)=390美元 我能想到的唯一方法

我想计算受某些阈值约束的家庭的水费成本: 基本上,阈值如下所示:

  • 对于第一个0-10 m3,成本为10美元
  • 对于随后的11-20 m3,将花费20美元
  • 对于随后的21-30 m3,将花费30美元
  • 对于随后的>30 m3,将花费40美元
例如,如果一个家庭使用40 m3的水,将收取以下费用:

(10*10)+(10*20)+(10*30)+(10*40)=1000美元

如果一个家庭使用23 m3的水,将收取以下费用:

(10*10)+(10*20)+(3*30)=390美元


我能想到的唯一方法是使用if条件句。我认为这不是最好的计算方法。

首先定义一个列表,该列表将以
(数量、价格差异)
格式保存这些限制:

lst = [(10, 10), (10, 20), (10, 30), (None, 40)]
请注意,顺序很重要。这里的
None
代表“无限制”。现在是函数:

def get_money(volume):
    if volume <= 0:
        return 0

    total = 0
    for diff, price in lst:
        if volume == 0:
            break

        if diff is None:
            total += volume * price
            volume = 0
        elif volume > diff:
            total += diff * price
            volume -= diff
        else:
            total += volume * price
            volume = 0

    return total
def get_money(体积):
如果体积差异:
合计+=差异*价格
体积-=差异
其他:
合计+=数量*价格
体积=0
返回总数

顺便说一句:如果不使用
if
:,就无法解决此问题

您也可以使用字典:

dic = {0:(0,10), 1:(100,20), 2:(300,30), 3:(600,40)}
那么您只需要一次if语句

def costs(vol):
    interval = vol/10 # vol must be positive int
    if interval in dic:
        price = dic[interval]
        return price[0] + price[1]*(vol-price[1] + 10)
    else:
        return dic[3][0] + dic[3][1]*(vol-dic[3][1] + 10)

你可以利用成本函数是分段线性的这一事实。因此,你必须找出你所处的时间间隔,并将其作为字典的索引,在字典中,你可以节省每个时间间隔开始时的成本以及成本的增加。

使用
if
语句有什么错?这将是最快最短的解决方案。这是什么魔法?“你能给我解释一下吗?”威廉你的成本函数是逐步线性的。因此,你只需要知道你在哪一步。您可以通过
interval=vol/10
了解这一点。每个步骤开始时的成本值也是已知的:0、100、300、600这与此步骤的实际成本一起保存在dict中。啊,是的,耶,你根据时间间隔来计算初始成本,该死..我希望我这么聪明。干得好由于可读性计数和DRY很重要,我会在函数中执行
成本=lambda vol,offset,slope:offset+slope*(vol-slope+10)
,甚至是相同的操作,然后执行
…返回成本(vol,*dic[interval])