如何在Python中计算给定时间范围内可用时间的效率?

2024-10-01 07:18:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在处理多个时间范围。我必须计算可用时间的效率(即分数)。这个问题可以和任何官僚机构相比。你知道吗

我只是简单地使用了多个if-else语句,有没有更好的方法来处理这类问题,因为代码太长了。 查询时间以元组形式给出,开放时间以元组列表形式给出。你知道吗

    def efficiencyRatio(inquiryTime, openingHours):
       if len(openingHours) > 1:
         ----code remain-----
       else:
         if inquiryTime[0] >= openingHours[0][0] and inquiryTime[1] <= 
         openingHours[0][1]:
             return 1

         elif inquiryTime[0] >= openingHours[0][1] or inquiryTime[1] <= 
         openingHours[0][0]:
            return 0

        elif inquiryTime[0] < openingHours[0][0] and inquiryTime[1] <= 
        openingHours[0][1]:
           totalInquiryTime = inquiryTime[1] - inquiryTime[0]
           usableInquiryTime = inquiryTime[1] - openingHours[0][0]
           efficiency = usableInquiryTime / totalInquiryTime 

       elif inquiryTime[0] >= openingHours[0][0] and inquiryTime[1] > 
       openingHours[0][1]:
          totalInquiryTime = inquiryTime[1] - inquiryTime[0]
          usableInquiryTime = openingHours[0][1] -inquiryTime[0]  
          efficiency = usableInquiryTime / totalInquiryTime

      elif inquiryTime[0] <= openingHours[0][0] and inquiryTime[1] >= 
      openingHours[0][1]:
         totalInquiryTime = inquiryTime[1] - inquiryTime[0]
         usableInquiryTime = openingHours[0][1] - openingHours[0][0]  
         efficiency = usableInquiryTime / totalInquiryTime

我的问题的输入和输出如下。你知道吗

    Inquiry Time       Opening Time        Answer
    (10, 18)       [(10, 12), (14, 16)]     0.50
    (10, 12)       [(09, 14)]               1.00
    (08, 12)       [(00, 10)]               0.50

Tags: andreturniftime时间else形式元组
1条回答
网友
1楼 · 发布于 2024-10-01 07:18:22

如果我理解正确,我会通过引入一些更简单的操作来简化代码overlap来计算两个间隔之间的重叠,并duration来计算间隔的(绝对)持续时间。你知道吗

def overlap(interval1, interval2):
    interval1 = sorted(interval1)
    interval2 = sorted(interval2)
    result = (
        max([interval1[0], interval2[0]]),
        min([interval1[1], interval2[1]]))
    if result[0] > result[1]:
        return (0, 0)
    else:
        return result

def duration(interval):
    return abs(interval[1] - interval[0])

def efficiency_ratio(inquiry_interval, open_intervals):
    assert(all(
        duration(overlap(interval1, interval2)) == 0
        for interval1, interval2 in itertools.combinations(open_intervals, 2)))
    effective_duration = sum([
        duration(overlap(inquiry_interval, open_interval))
        for open_interval in open_intervals])
    return effective_duration / duration(inquiry_interval)

请注意: -对于最大界限在最小界限之前的输入间隔,代码还有额外的逻辑。 输出总是采用(min_bound, max_bound)格式。 -open_intervals应该是非重叠的,这就是在assert()中实现的附加逻辑的含义

为了测试这项工作是否适用于您的用例,我们可以:

print(efficiency_ratio((10, 18), [(10,12), (14, 16)]))
# 0.5
print(efficiency_ratio((10, 12), [(9, 14)]))
# 1.0
print(efficiency_ratio((8, 12), [(0, 10)]))
# 0.5

编辑:添加了更多的输入检查。你知道吗

相关问题 更多 >