您可以将每个间隔存储为与时间间隔的开始/结束相对应的一对整数:
from collections import namedtuple
Interval = namedtuple('Interval', 'start end')
如果你有'10-13'这样的字符串;你可以把它转换成Interval:
user_hours = Interval(*map(int, '10-13'.split('-')))
# -> Interval(start=10, end=13)
要找出“在那个时间间隔有哪些动物可以展示”,您需要知道两个给定的时间间隔是否相交:
def intersect(a, b):
return a.start < b.end and b.start < a.end
例子:
>>> intersect(Interval(8,18), Interval(10,13))
True
没有隔夜间隔,因此您可以将时间间隔视为线性(一条线上的间隔)。
现在,您只需在表格中填入动物园动物的参观时间:
visiting_hours = {
"bear": Interval(8, 18), # 08-18
"lion": Interval(14, 16), # 14-16
}
您可以打印在给定的用户时间内可以使用哪些动物:
for animal, available_hours in visiting_hours:
if intersect(user_hours, available_hours):
print(animal)
作为替代方案,您可以使用 datetime.time() 而不是 int 来表示小时 - 它会自动强制小时的有效值 (0..23):
from datetime import datetime
while True:
user_input = input("Input time interval e.g., 10-13: ")
try:
user_hours = Interval(*[datetime.strptime(h, "%H").time()
for h in user_input.split('-')])
except ValueError as e:
print("Invalid input: %s. Try again." % (e,))
else:
break
相应地修改“访问时间”表:
from datetime import time
visiting_hours = {
"bear": Interval(time(8), time(18)),
"lion": Interval(time(14), time(16)),
}
您可以自动化输入,例如,通过从文件中读取访问时间。
其余代码保持不变。
您可以将访问时间保存到单独的文件中,例如 SQLite 数据库并独立编辑表格(使用另一个脚本):
#!/usr/bin/env python
import sqlite3
db = sqlite3.connect(':memory:') # create in memory for debugging
db.execute('''CREATE TABLE intervals
(animal text, start integer, end integer)''')
# populate
visiting_hours = [('bear', '08-18'), ('lion', '14-16')]
db.executemany('INSERT INTO intervals VALUES (?, ?, ?)',
[[animal] + list(map(int, hours.split('-')))
for animal, hours in visiting_hours])
从数据库中获取动物:
# "what animals are available for show at that time interval"
for animal, in db.execute('''SELECT animal FROM intervals
WHERE ? < end and start < ?''',
tuple(map(int, '10-13'.split('-')))):
print(animal)