首页 > 解决方案 > 使用循环而不是手动输入创建时间列表

问题描述

我正在尝试从上午 9 点到下午 5 点以 30 分钟的间隔创建一个选项列表。例如

    times = ['09:00-09:30', '09:30-10:00', '10:00-10:30', '10:30-11:00', '11:00-11:30', '11:30-12:00',
            '12:00-12:30', '12:30-13:00', '13:00-13:30', '13:30-14:00', '14:00-14:30', '14:30-15:00',
            '15:00-15:30', '15:30-16:00', '16:00-16:30', '16:30-17:00']

我怎么能做到这一点,但使用循环或看起来不那么冗长的方法?

标签: python

解决方案


datetime从 9 点开始创建一个可迭代的对象。

import datetime

fmt = '%H:%M'
start = datetime.datetime.strptime('09:00', fmt)
times = (start + datetime.timedelta(minutes=30*i) for i in range(17))

datetime对象转回字符串。

times_str = (t.strftime(fmt) for t in times)

成对迭代times_str。该itertools文档有一个名为pairwise. 您可以复制粘贴该功能或从中导入它more_itertools(需要安装)。

from more_itertools import pairwise
result = ['-'.join(times) for times in pairwise(times_str)]

输出:

>>> print(result)
['09:00-09:30', '09:30-10:00', '10:00-10:30', '10:30-11:00', '11:00-11:30', '11:30-12:00', '12:00-12:30', '12:30-13:00', '13:00-13:30', '13:30-14:00', '14:00-14:30', '14:30-15:00', '15:00-15:30', '15:30-16:00', '16:00-16:30', '16:30-17:00']

您可以使用函数封装所有内容。

import datetime
from more_itertools import pairwise

def timepairs(start:datetime.datetime, steps:int, delta:datetime.timedelta, fmt='%H:%M'):
    times = (start + delta*i for i in range(steps + 1))
    times_str = (t.strftime(fmt) for t in times)
    return ['-'.join(times) for times in pairwise(times_str)]

演示:

>>> start = datetime.datetime.strptime('09:00', '%H:%M')
>>> timepairs(start, 16, datetime.timedelta(minutes=30))
['09:00-09:30', '09:30-10:00', '10:00-10:30', '10:30-11:00', '11:00-11:30', '11:30-12:00', '12:00-12:30', '12:30-13:00', '13:00-13:30', '13:30-14:00', '14:00-14:30', '14:30-15:00', '15:00-15:30', '15:30-16:00', '16:00-16:30', '16:30-17:00']
>>> 
>>> start = datetime.datetime.strptime('00:00', '%H:%M')
>>> timepairs(start, 12, datetime.timedelta(minutes=5))
['00:00-00:05', '00:05-00:10', '00:10-00:15', '00:15-00:20', '00:20-00:25', '00:25-00:30', '00:30-00:35', '00:35-00:40', '00:40-00:45', '00:45-00:50', '00:50-00:55', '00:55-01:00']

推荐阅读