2015-11-10 20 views
0

我在編程方面很新穎,現在我正在使用Zoo in python,一個程序,用戶可以在動物園的開放時間內選擇一個時間間隔。動物園從07-23開放,例如從08-18開始可以看到熊。例如, 。 你想什麼時候去參觀動物園? 輸入用戶:10-13作爲字符串的時間間隔python

這時你可以看到動物: ... ...

,程序會寫出來的到底是什麼動物,都可以顯示在該時間間隔。以我們的例子爲例,熊將可用並被打印出來。

林想知道如何我可以很容易地使程序翻譯輸入由用戶輸入一個字符串或可能與範圍,所以我沒有創建像06-06,06-07,06-08一百個不同的變量, 06-09等 任何想法? 謝謝!

+1

如果你問「如何取一個包含'」06-08「的變量'a',並得到兩個變量'b'和'c'包含'」06「和」「08 「'分別?」:'b,c = a.split(「 - 」)' – Kevin

+0

什麼你到目前爲止嘗試過嗎?您可能需要將每個字符串轉換爲整數,開始時間和結束時間。 – DJMcMayhem

回答

0

我想通過改變問一點點以下解決這個問題:

將你在動物園什麼時候到達? 上午9點11/11/2015

你想呆多久? 3小時

這將讓你用一個漂亮的日期選擇器插件的前端,然後您可以創建一開始就datetime object。接下來,在此期間創建一個timedelta對象。您可以將起始對象的delta應用於結束時間,以便您不必擔心解析。

我推薦這個的另一個原因是有趣的,我見過證據表明用戶感知開始和持續時間,更清晰/更易於使用,而不是選擇兩次。根據以上所述,您計劃在動物園花4小時,而不是專門從X到Y,因此此UI更好地匹配心理模型。

+0

你正在使事情變得複雜,爲什麼當他考慮一天時他需要日期選擇器? –

+0

我不認爲這很複雜,原因如下:1,這是一個常用的圖書館用戶界面小部件,他可以使用,而無需進行自己的驗證。 2,這是用戶熟悉的交互和知道如何使用的東西。 3.它提供了一個完整的日期來構建一個日期時間對象,而不是隻有一個任意的整數,他必須派生含義。他正在處理日期和時間,並應該像這樣處理這些數據。 –

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 

相應修改「探視時間」表:

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) 
相關問題