python - 确定连续小时块的开始和结束时间
问题描述
我有一个包含几个小时的 Python 列表。例如[7,8,9,10,17,23,1,2,3]
,小时采用 24 小时格式,范围从 0 到 23(0 = 午夜,23 = 晚上 11 点)。
我喜欢确定连续小时块的开始和结束时间。所以我想要的最终结果应该是一个列表,其中包含包含块开始和结束时间的字典。
尤其是确定从经过午夜(从 23 到 0)的块开始的块使得它变得困难。
期望的结果:
hour_blocks = (
{
"block_nr": 1,
"block_start": 7,
"block_end": 10
},
{
"block_nr": 2,
"block_start": 17,
"block_end": 17
},
{
"block_nr": 3,
"block_start": 23,
"block_end": 3
}
)
我从一个非常粗糙的版本开始,但我卡住了(见下文)。我也想不出任何可以使这更容易的 Python 库(例如 datetime 或 calendar 库)。
i = 0
busy_blocks = []
hour_list = [7,8,9,10,17,23,1,2,3]
start = False
next_hour_connected = False
for hour in hour_list:
if hour == hour_list[i + 1] -1 and not start:
# Next hour is connected and no start is defined
busy_block_start = hour
start = True
continue
if hour == hour_list[i + 1] - 1:
# Next hour is still connected
#if the subsequent hour is not connected, we define the block end
if (hour != hour_list[i + 2] - 2) or next_hour_connected:
busy_block_end = hour
# Save block
busy_blocks.append({
"busy_block_start": busy_block_start,
"busy_block_end": busy_block_end
})
# Reset block
start = False
next_hour_connected = False
else:
# Remember that next
next_hour_connected = True
解决方案
好的,所以我不确定您提供的示例是否正确。因为你说的时间范围是0到23,所以“23, 1”不是连续的,除非是“23, 0”。
无论如何,我尝试实现一个简单的算法,它使用一个列表来临时存储连续的小时数。代码很长,而且绝对没有完全优化,但希望你能了解我在这里想要做什么。
hour_blocks = []
hour_list = [7,8,9,10,17,23,1,2,3]
hour_block= []
for i in range(len(hour_list)-1):
hour = hour_list[i]
nextHour = hour_list[i+1]
#get current hour and next hour
if (not hour_block): #if hour_block is empty, append the time
hour_block.append(hour)
if (hour==nextHour-1 or (hour==23 and nextHour==0)): #if hours were consecutive, append to hour_block
hour_block.append(nextHour)
else: #if not, add the first and the last element of the hour_block as the beginning time and end time
hour_blocks.append({"begin":hour_block[0], "end":hour_block[-1]})
hour_block = [] #clear the hour_block
if i == len(hour_list)-2 and hour_block: #append hour_block to hour_blocks when loop is finished
hour_blocks.append({"begin":hour_block[0], "end":hour_block[-1]})
hour_block = []
print(hour_blocks)
#prints [{'begin': 7, 'end': 10}, {'begin': 17, 'end': 17}, {'begin': 23, 'end': 23}, {'begin': 1, 'end': 3}]
Błotosmętek 的答案似乎也有效,因此您可能也想使用它(尽管您需要自己实现循环系统)
希望这有帮助,干杯:)
推荐阅读
- java - 为什么当我尝试在没有物品的库存外部/在库存中单击时出现错误
- plot - 如何设置倍频程 x 轴限制和间隔
- haskell - 实现树时“解析模式中的错误”
- php - Laravel,如何对循环数组进行排序和分页
- algorithm - 将欧几里德距离之和最小化到一组 n 个点的点
- c# - 在 C# 中使用 Async/Await/Task 进行函数重载的正确方法是什么
- jquery - 根据 matchmedia 事件修改尚未在 dom 中的元素的 css
- java - Apache Camel 返回带有转义字符的 JSON
- php - 由于找不到目录或文件,PHP 未删除文件
- r - 如何根据另一个因素计算一个因素