【问题标题】:Time intervals as strings python时间间隔作为字符串python
【发布时间】:2015-11-10 19:47:18
【问题描述】:

我是编程新手,现在我正在使用 Python 中的 Zoo,这是一个用户可以在动物园开放时间内选择输入时间间隔的程序。动物园从 07-23 开放,例如熊可以从 08-18 观看。 例如。 你想什么时候参观动物园? 用户输入:10-13

此时你可以看到动物: ... ...

并且程序将准确地写出在该时间间隔内可以展示哪些动物。鉴于我们的示例,熊将可用并被打印出来。

我想知道如何轻松让程序将用户的输入转换为字符串或范围,因此我不必创建一百个不同的变量,例如 06-06、06-07、06-08、06 -09 等 有任何想法吗? 谢谢!

【问题讨论】:

  • 如果您问“我如何获取包含"06-08" 的变量a,并获取两个变量bc,分别包含"06""08" ?":b,c = a.split("-")
  • 到目前为止你尝试过什么?您可能希望将每个字符串转换为整数、开始时间和结束时间。

标签: python string variables time range


【解决方案1】:

我会通过将询问更改为以下内容来解决此问题:

你什么时候到达动物园? 2015 年 11 月 11 日上午 9 点

你想待多久? 3 小时

这将让您在前端使用一个不错的日期选择器小部件,然后您可以创建一个datetime object 作为开始。接下来,为持续时间创建一个timedelta 对象。您可以将增量应用于开始对象以获取结束时间,因此您不必担心解析。

我推荐这个的另一个原因是,我已经看到证据表明用户感知开始和持续时间并且更清晰/更易于使用,而不是选择两次。根据上述内容,您计划在动物园度过 4 个小时,而不是专门从 X 到 Y 在那里,所以这个 UI 更符合心智模型。

【讨论】:

  • 你把事情弄复杂了,为什么他考虑到一天就需要一个日期选择器?
  • 我认为这并不复杂,原因有很多:1,它是一个常用的库 UI 小部件,他无需自己验证即可使用。 2,它是用户熟悉交互并知道如何使用的东西。 3. 它提供了一个完整的日期来构建一个日期时间对象,而不是仅仅拥有一个他必须获得意义的任意整数。他正在处理日期和时间,并且应该处理这些数据。
【解决方案2】:

您可以将每个间隔存储为与时间间隔的开始/结束相对应的一对整数:

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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-26
    • 2011-03-07
    • 2016-08-13
    • 2021-06-27
    • 1970-01-01
    • 2018-06-06
    相关资源
    最近更新 更多