Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 以字符串形式表示的时间间隔_Python_String_Variables_Time_Range - Fatal编程技术网

Python 以字符串形式表示的时间间隔

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等。 有什

我对编程相当陌生,现在我正在使用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)