我非常擅长编程,现在我正在使用python中的Zoo,这是一个程序,用户可以在动物园的开放时间内选择一个时间间隔。动物园的开放时间为07-23,例如熊可以从08-18开始观看。 例如。 你什么时候去动物园? 用户输入:10-13
此时你可以看到动物: ... ...
该程序将准确地写出在该时间间隔内可供展示的动物。根据我们的例子,熊将可用并打印出来。
我想知道如何轻松地让程序将用户的输入转换为字符串或者可能是范围,所以我不必创建一百个不同的变量,如06-06,06-07,06-08,06 -09等 有任何想法吗? 谢谢!
答案 0 :(得分:0)
我通过稍微改变一下问题来解决这个问题:
你什么时候到达动物园? 2015年11月11日上午9点
你想待多久? 3小时
这将允许您在前端使用一个不错的日期选择器小部件,然后您可以为开始创建datetime object。接下来,在持续时间内创建一个timedelta对象。您可以将delta作为起始对象应用于获取结束时间,这样您就不必担心解析。
我推荐这个的另一个原因是有趣的是,我已经看到用户感知开始和持续时间并且更清晰/更容易使用而不是选择两次的证据。根据上述情况,您计划在动物园花费4个小时,而不是专门从X到Y,因此这个UI更适合心理模型。
答案 1 :(得分:0)
您可以将每个间隔存储为与时间间隔的开始/结束对应的一对整数:
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
修改&#34;访问时间&#34;表相应地:
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)