Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中的区间计算_Python - Fatal编程技术网

Python中的区间计算

Python中的区间计算,python,Python,我正在写一个程序,我需要计算一部电影的总观看时间 1st watch = (0,10) 2nd Watch =(13,18) 3rd watch =(15,23) 4th watch =(21,26) 电影总观看量=10+5+5+3=23分钟 如何在Python中实现这一点好的,这里真正的挑战是重叠序列。对不起,你的问题不是很清楚 这不是最优的,请参见下面的更好算法,但您可以尝试: l = [(0, 10), (13, 18), (15, 23), (21, 26)] s = set() fo

我正在写一个程序,我需要计算一部电影的总观看时间

1st watch = (0,10)
2nd Watch =(13,18)
3rd watch =(15,23)
4th watch =(21,26)
电影总观看量=10+5+5+3=23分钟


如何在Python中实现这一点好的,这里真正的挑战是重叠序列。对不起,你的问题不是很清楚

这不是最优的,请参见下面的更好算法,但您可以尝试:

l = [(0, 10), (13, 18), (15, 23), (21, 26)]
s = set()
for w in l:
    s = s.union(range(*w))
d = len(s)
它应该会起作用。它给出d=23

编辑:更好的算法

l = [(0, 10), (13, 18), (15, 23), (21, 26)]
flat_list = sorted([(t[0], 1) for t in l] + [(t[1], -1) for t in l])
# flat_list == [(0, 1), (10, -1), (13, 1), (15, 1), (18, -1), (21, 1), (23, -1), (26, -1)]
duration = level = 0
start = None
for minute, level_inc in flat_list:
    level += level_inc
    if level == 0:
        duration += minute - start
        start = None
    elif start is None and level == 1:
        start = minute
assert(level == 0)  # something is wrong otherwise
print("Duration is {}".format(duration))

把数字加起来?我不明白代码中的数字是如何与10+5+5+3=23分钟联系起来的。0-10==10分钟,13-18==5分钟,15-23==5分钟,因为这部电影在前一段时间内已经看了18分钟,21-26=3分钟,从之前看到23分钟,这方面的任何帮助都会非常宝贵。这个问题非常模糊。。。您是否只需要从输入中合计一些数字?@Luke.py问题是确定用户已观看的电影部分。它必须排除重叠部分,并仅计算观看的持续时间。例如:0-10:这个人已经看了10分钟,13-18:这个人已经看了5分钟,15-23我们必须排除到第18分钟,并且只计算18-23,因为这个人在18分钟之前已经看到了这一点。你能解释一下代码的第二行吗。平面列表=排序后的[t[0],1代表l中的t]+[t[1],-1代表l中的t]…这部分在做什么?它构建一个包含两个项目元组的平面列表,其中第一个是时间码,第二个是1代表开始时间码,-1代表结束时间码。此列表按时间码排序。要分解:[t[0],l]中t的1是一个列表。它构建了一个包含起始时间码的2元组列表。[t[1],-1表示l中的t]对结束时间代码也有同样的作用,第二项是-1,而不是1。[t[0],1表示l中的t]+[t[1],-1表示l中的t]通过将第二个列表追加到第一个列表来构建单个列表,尽管追加不是正确的单词,因为它不是同一个对象,而是新的对象。然后分类。。。对这个元组列表进行排序。元组的默认排序是根据它们的第一项和下一项(如果需要),因此在这种情况下是时间码。这让我认为,在时间码既是开始码又是结束码的情况下,应该验证这种算法,例如:8-14,14-17。