2012-05-22 41 views
8

Hãy nói rằng hôm nay tôi làm việc 9:00-18:00, tôi có 3 cuộc hẹn:Python - Thuật toán tìm các khe thời gian

  • 10:00 - 10:30
  • 12:00 - 13: 00
  • 15:30 - 17:10

tôi cần phải tìm một danh sách các khe thời gian có sẵn của 1 giờ trong ngày.
Dưới đây là danh sách mà tôi sẽ nhận được

  • 09:00 - 10:00
  • 10:30-11:30
  • 13:00-14:00
  • 14:00 - 15:00

Tôi đã triển khai thực hiện điều đó trong php và tôi đã cố gắng đặt nó vào python.
Đây là cố gắng của tôi:

def get_slots(areas, duration): 
    slots = [] 
    for area in areas: 
     if area['start'] == area['end']: 
      continue 
     i = area['start'] 
     while (i + duration) <= area['end']: 
      i += duration 
      slots.append({ 
       'start': (i - duration), 
       'end': i, 
      }) 
    return slots 

def get_areas(day_start, day_end, appts): 
    areas = [] 
    old_end = day_start 
    for appt in appts: 
     if appt['start'] > old_end: 
      areas.append({ 
       'start': old_end, 
       'end': appt['start'], 
      }) 
     old_end = appt['end'] 
     if old_end > day_end: 
      return areas 
    areas.append({ 
     'start': old_end, 
     'end': day_end, 
    }) 
    return areas 

Test:

>>> day_start = datetime.datetime(2012, 5, 22, 9) 
>>> day_end = datetime.datetime(2012, 5, 22, 18) 
>>> appts = [{ 
    'start': datetime.datetime(2012, 5, 22, 10), 
    'end': datetime.datetime(2012, 5, 22, 10, 30), 
    },{ 
    'start': datetime.datetime(2012, 5, 22, 12), 
    'end': datetime.datetime(2012, 5, 22, 13), 
    },{ 
    'start': datetime.datetime(2012, 5, 22, 15, 30), 
    'end': datetime.datetime(2012, 5, 22, 17, 10), 
    },] 
>>> duration = datetime.timedelta(hours=1) 
>>> pprint.pprint(get_slots(get_areas(day_start, day_end, appts), duration)) 

Nó hoạt động, nhưng tôi chỉ đơn giản là chuyển mã từ php.
Vì vậy, tôi không chắc đó là một cách để làm điều đó.

Bạn có thể chỉ cho tôi nơi tôi có thể cải thiện không?

+0

Nếu khoảng thời gian từ 11: 00-12: 00 cũng được xem xét? –

+0

Không, nó chỉ nhận được các khối thời gian tuần tự từ mỗi "khu vực" bắt đầu –

Trả lời

10
#time_slots.py 
from datetime import datetime, timedelta 

appointments = [(datetime(2012, 5, 22, 10), datetime(2012, 5, 22, 10, 30)), 
       (datetime(2012, 5, 22, 12), datetime(2012, 5, 22, 13)), 
       (datetime(2012, 5, 22, 15, 30), datetime(2012, 5, 22, 17, 10))] 

hours = (datetime(2012, 5, 22, 9), datetime(2012, 5, 22, 18)) 

def get_slots(hours, appointments, duration=timedelta(hours=1)): 
    slots = sorted([(hours[0], hours[0])] + appointments + [(hours[1], hours[1])]) 
    for start, end in ((slots[i][1], slots[i+1][0]) for i in range(len(slots)-1)): 
     assert start <= end, "Cannot attend all appointments" 
     while start + duration <= end: 
      print "{:%H:%M} - {:%H:%M}".format(start, start + duration) 
      start += duration 

if __name__ == "__main__": 
    get_slots(hours, appointments) 


% python time_slots.py 
09:00 - 10:00 
10:30 - 11:30 
13:00 - 14:00 
14:00 - 15:00 
+0

Đó thực sự là pythonic hơn :) Tôi sẽ cố gắng sử dụng nó –

+0

Làm việc tốt. Nhưng có lẽ 'get_slots' cũng nên ra lệnh cho các cuộc hẹn để ngăn chặn lỗi –

+0

@PierredeLESPINAY chỉ để cho vui, tôi đã thực hiện một số thay đổi để sắp xếp các khe + thử kiểm tra xem tất cả các cuộc hẹn có thể được tham dự hay không. Phân loại là một ý tưởng hay. –

Các vấn đề liên quan