Python 以字符串形式表示的时间间隔
我对编程相当陌生,现在我正在使用python与Zoo合作,在python中,用户可以在Zoo的开放时间内选择一个时间间隔。动物园从07-23开放,例如,熊从08-18可以观看。 例如 你想什么时候参观动物园? 用户输入:10-13 此时,您可以看到动物: ... 该节目将准确地写出在该时间间隔内可供展示的动物。根据我们的示例,熊将可用并打印出来 我想知道如何让程序轻松地将用户的输入转换为字符串或范围,这样我就不必创建100个不同的变量,如06-06、06-07、06-08、06-09等。 有什么想法吗?Python 以字符串形式表示的时间间隔,python,string,variables,time,range,Python,String,Variables,Time,Range,我对编程相当陌生,现在我正在使用python与Zoo合作,在python中,用户可以在Zoo的开放时间内选择一个时间间隔。动物园从07-23开放,例如,熊从08-18可以观看。 例如 你想什么时候参观动物园? 用户输入:10-13 此时,您可以看到动物: ... 该节目将准确地写出在该时间间隔内可供展示的动物。根据我们的示例,熊将可用并打印出来 我想知道如何让程序轻松地将用户的输入转换为字符串或范围,这样我就不必创建100个不同的变量,如06-06、06-07、06-08、06-09等。 有什
谢谢 我将通过将ask稍微更改为以下内容来解决此问题: 你什么时候到动物园?2015年11月11日上午9时 你想住多久?3小时 这将允许您在前端使用一个很好的日期选择器小部件,然后您可以创建一个用于开始的日期选择器小部件。接下来,为持续时间创建一个对象。您可以将delta应用于start对象以获取结束时间,这样就不必担心解析
我建议这样做的另一个原因是,据我所知,有证据表明,用户认为开始和持续时间更清晰/更容易使用,而不是选择两次。如上所述,您计划在动物园呆4个小时,而不是从X到Y专门呆在那里,因此此UI更符合心智模型。您可以将每个时间间隔存储为一对整数,对应于时间间隔的开始/结束:
from collections import namedtuple
Interval = namedtuple('Interval', 'start end')
如果您有一个字符串,如“10-13”;您可以将其转换为间隔:
要了解在该时间间隔可供展示的动物,您需要知道两个给定的时间间隔是否相交:
def intersect(a, b):
return a.start < b.end and b.start < a.end
没有隔夜间隔,因此可以将时间间隔视为直线上的线性间隔
现在,您只需在表中填入动物园动物的参观时间:
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)
如果你问我如何取一个包含06-08的变量a,然后得到两个分别包含06和08的变量b和c?:b,c=a.split-到目前为止你试过什么?你可能想把每个字符串转换成整数,一个开始时间和一个结束时间。你让事情变得复杂了,为什么他只考虑一天的时间就需要一个日期选择器呢?我认为这并不复杂,原因有很多:1,这是一个通用的库UI小部件,他可以不用自己验证就可以使用。2、它是用户熟悉的交互工具,并且知道如何使用。3.它提供了一个完整的日期来构建datetime对象,而不仅仅是一个他必须推导出含义的任意整数。他在处理日期和时间,因此应该处理这些数据。
#!/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)