2017-10-09 52 views
1

我有一个使用密钥在%H:%M:%S中创建的字典及其值。根据当前系统时间确定python中的字典值

dict = { 
'06:00:01': '0x95', '06:10:01': '0x97', 
'06:20:01': '0x98', '06:30:01': '0x99', 
'06:40:01': '0x101', '06:50:01': '0x102', 
'07:00:01': '0x104', '07:10:01': '0x105', 
'07:20:01': '0x106', '07:30:01': '0x107', 
'07:40:01': '0x109', '07:50:01': '0x110', 
'08:00:01': '0x111', '08:10:01': '0x112', 
'08:20:01': '0x113', '08:30:01': '0x114', 
'08:40:01': '0x115', '08:50:01': '0x116', 
'09:00:01': '0x117', '09:10:01': '0x118', 
'09:20:01': '0x119', '09:30:01': '0x119', 
'09:40:01': '0x120', '09:50:01': '0x121', 
'10:00:01': '0x122', '10:10:01': '0x122', 
'10:20:01': '0x123', '10:30:01': '0x124', 
'10:40:01': '0x124', '10:50:01': '0x125', 
'11:00:01': '0x125', '11:10:01': '0x126', 
'11:20:01': '0x126', '11:30:01': '0x126', 
'11:40:01': '0x127', '11:50:01': '0x127', 
'12:00:01': '0x127', '12:10:01': '0x128', 
'12:20:01': '0x128' 
} 

我想要根据当前系统时间返回字典值的逻辑。如果当前系统时间在字典应该在Python返回下键的值的两个关键值的范围

+0

如果你没有看到我的编辑 - 你重写字典对象默认名称。在我的程序中,我将它重命名为'date_dict'。 – atru

+0

我没有意识到这一点。感谢您纠正我!我会很快测试你的答案。 –

+0

我把它放在脑海里告诉你,直到第二天才完全忘记它。让我知道它是如何工作的! – atru

回答

0

此解决方案假定您不使用AM/PM格式:

from datetime import datetime 

cur_time = datetime.now().time() 
print cur_time 

keys = sorted(date_dict.keys()) 
times = [datetime.strptime(i, "%H:%M:%S") for i in keys] 

out = False 
for idx, t in enumerate(times): 
    if cur_time >= t.time(): 
     t1 = times[min(idx+1, len(times)-1)].time() 
     if cur_time <= t1: 
      out = date_dict[str(t.time())] 
print out 

我切换字典对象的默认名称dictdate_dict - 这正是您的问题的字典。使用默认名称覆盖它们,所以不应该这样做。

cur_time是当前时间,为方便起见而印刷。 keys是一个已排序的字典键列表,然后将它们变成的datetime对象。这可以在一条线上完成,但接缝更具可读性。

for循环使用enumerate来访问datetime对象及其索引idx。如果当前时间大于或等于对象时间,代码会检查它是否也小于或等于列表中的下一个对象。如果是这种情况,则当前时间适合该范围,并将较低的值(t.time())分配给out。如果完全不在字典范围内,则该值将保持为默认的“False”。

times[min(idx+1, len(times)-1)]部分可以防止索引超出范围大于'12:20:01'的值。

您可以轻松地通过使用timedelta并产生不同的时间,不同的在这里通过小时的测试这个程序:

from datetime import timedelta 

cur_time = (datetime.now() + timedelta(hours=8)).time()