Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.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,我有个问题。假设给我一个元组列表,其中的开始时间和结束时间是在视频中观看的分钟数。(例如,[(0,10)、(17,25)])按开始时间排序。我得到了视频的总长度(例如30),并要求我找出不间断时间段的最大总分钟数。在这个例子中,答案是7分钟。(10日至17日) 以下是我的解决方案: #example data video = [(5,10),(13,18),(15,23),(21,23)] total_minutes_video = 30 #first row calculate free_m

我有个问题。假设给我一个元组列表,其中的开始时间和结束时间是在视频中观看的分钟数。(例如,[(0,10)、(17,25)])按开始时间排序。我得到了视频的总长度(例如30),并要求我找出不间断时间段的最大总分钟数。在这个例子中,答案是7分钟。(10日至17日)

以下是我的解决方案:

#example data
video = [(5,10),(13,18),(15,23),(21,23)]
total_minutes_video = 30

#first row calculate free_minutes from start
free_minutes= video [0][0]
lastend = video [0][1]

for beg,end in video :
  if beg>lastend:
    free_minutes = max(beg-lastend,free_minutes)
  lastend = max(lastend,end)

#last row, have to check how many minutes until end of video
free_minutes= max(free_minutes,total_minutes_video-video[len(video)-1][1])

print(free_minutes)

显然这不是最漂亮的,我觉得我可以做得更好。有没有办法避免在顶部和底部进行逻辑运算?

如果你的目标是跳过逻辑,你可以列举并将范围缩短1,然后取当前项的1位和下一项的0位的差值,当然,我们必须使用
*-1
将这些值反向添加到列表中,我尝试反向执行列表以跳过该操作,但我做不到。然后我们可以得到最后一个值1的位置和总时间之间的差,加上它。只需要最大限度地利用这个列表

free = [(item[1] - v[idx+1][0])*-1 for idx, item in enumerate(v[:-1])]
free.append(total - v[-1][1])
print(max(free))
如果必须是一行,尽管违反PEP-8最大行数

free = max([(item[1] - v[idx+1][0])*-1 for idx, item in enumerate(v[:-1])] + [total -v[-1][1]])

将您的列表转换为未观察间隔的列表:

v = [(0, 0)] + video + [(total_minutes_video, total_minutes_video)]
unwatched = [(a[1], b[0]) for a, b in zip(v[:-1], v[1:])]
然后找到最长的:

worst = max(unwatched, key=lambda x: x[1] - x[0])

如果您关心内存,则可以使用生成器来完成此操作:

import itertools
v = itertools.chain([(0, 0)], video, [(total_minutes_video, total_minutes_video)])
unwatched = ((a[1], b[0]) for a, b in zip(v[:-1], v[1:]))
worst = max(unwatched, key=lambda x: x[1] - x[0])

你可以简单地在列表的开头和结尾加上(-1,0)和(TooTrim-MutuSuxValtudio,TooMultMutuSeVix+ 1)。“Julien Hm,不错,中间的逻辑是不是很好?哇,Python不能在lambdas中进行元组解包……WTF。非常聪明,我希望我可以在不创建辅助数组的情况下完成这项工作,但代码肯定比我的干净,谢谢你当然可以使用生成器和
itertools.chain来完成这项工作,如果你不想让它占用任何内存的话。看我的编辑。这也是聪明的,类似于上面的一个,但节省了一些空间。我宁愿不运行最后一行,但看起来这可能是不可避免的。感谢you@TimothyChang如果必须的话,我们可以写一行:)
import itertools
v = itertools.chain([(0, 0)], video, [(total_minutes_video, total_minutes_video)])
unwatched = ((a[1], b[0]) for a, b in zip(v[:-1], v[1:]))
worst = max(unwatched, key=lambda x: x[1] - x[0])