2014-02-14 33 views
2

我有一個列表是這樣的時隙:分組Python列表爲3小時

[{datetime.date(2014, 2, 13): [datetime.time(13, 53, 53), datetime.time(13, 7, 52), datetime.time(12, 43, 35), datetime.time(12, 3, 14), datetime.time(11, 54, 53), datetime.time(10, 52, 42), datetime.time(10, 46, 3), datetime.time(10, 32, 50), datetime.time(10, 32, 38), datetime.time(10, 27, 38), datetime.time(10, 13, 50), datetime.time(10, 9, 59), datetime.time(10, 9, 48), datetime.time(10, 7, 42), datetime.time(10, 7, 20), datetime.time(10, 5, 5)]} 

我想插槽整個事情到3小時插槽,使得它可以顯示爲:

datetime.date(2014, 2, 14): 

time-slot : 
     datetime.time(0,0,0) - datetime.time(3,0,0) 
      . 
      . #all times in this slot 
     datetime.time(3,0,0) - datetime.time(6,0,0) 
      . 
      . #all times in this slot 

等等。 我不太瞭解如何去做。任何人都可以提供一些提示或者一些算法來幫助我理解如何做到這一點?

+0

過濾器可能是一個很好的開始? – hd1

+0

@ hd1:是的,但我無法理解如何使用過濾器編寫此代碼。你能否給我寫一個例子,這可以幫助我? –

+1

@ itertools'(http://docs.python.org/2/library/itertools.html#itertools.groupby)中的@ApoorvAshutosh'groupby'可能對你很有意思。看到我的答案。 – wolfrevo

回答

2
from pprint import pprint 
result = {} 
for current_dict in d: 
    for key in current_dict: 
     slots = {} 
     for item in current_dict[key]: 
      slots.setdefault(item.hour/3+1, []) 
      slots[item.hour/3+1].append(item) 
     result[key] = slots 
pprint(result) 

輸出

{datetime.date(2014, 2, 13): {4: [datetime.time(11, 54, 53), 
            datetime.time(10, 52, 42), 
            datetime.time(10, 46, 3), 
            datetime.time(10, 32, 50), 
            datetime.time(10, 32, 38), 
            datetime.time(10, 27, 38), 
            datetime.time(10, 13, 50), 
            datetime.time(10, 9, 59), 
            datetime.time(10, 9, 48), 
            datetime.time(10, 7, 42), 
            datetime.time(10, 7, 20), 
            datetime.time(10, 5, 5)], 
           5: [datetime.time(13, 53, 53), 
            datetime.time(13, 7, 52), 
            datetime.time(12, 43, 35), 
            datetime.time(12, 3, 14)]}} 
2

你也可以用groupbyfrom itertools import groupby)與列表理解:

[(time_slot, [time_entry for time_slot, time_entry in time_entries]) for time_slot, time_entries in groupby([(timelist_item.hour // 3, timelist_item) for timelist_item in timelist], lambda x: x[0])] 

主要生產以下的輸出:

[(4, 
    [datetime.time(13, 53, 53), 
    datetime.time(13, 7, 52), 
    datetime.time(12, 43, 35), 
    datetime.time(12, 3, 14)]), 
(3, 
    [datetime.time(11, 54, 53), 
    datetime.time(10, 52, 42), 
    datetime.time(10, 46, 3), 
    datetime.time(10, 32, 50), 
    datetime.time(10, 32, 38), 
    datetime.time(10, 27, 38), 
    datetime.time(10, 13, 50), 
    datetime.time(10, 9, 59), 
    datetime.time(10, 9, 48), 
    datetime.time(10, 7, 42), 
    datetime.time(10, 7, 20), 
    datetime.time(10, 5, 5)])] 

使用你的數據如下:

timelist = [datetime.time(13, 53, 53), datetime.time(13, 7, 52), datetime.time(12, 43, 35), datetime.time(12, 3, 14), datetime.time(11, 54, 53), datetime.time(10, 52, 42), datetime.time(10, 46, 3), datetime.time(10, 32, 50), datetime.time(10, 32, 38), datetime.time(10, 27, 38), datetime.time(10, 13, 50), datetime.time(10, 9, 59), datetime.time(10, 9, 48), datetime.time(10, 7, 42), datetime.time(10, 7, 20), datetime.time(10, 5, 5)] 

timelist是你的字典的一天鍵值。正如@thefourtheye指出的這個列表必須分類才能使用groupby

dictionary_list = [{datetime.date(2014, 2, 13): [datetime.time(13, 53, 53), ... 
timelist = dictionary_list[0].items()[0][1] 
timelist.sort() 
+2

一件重要的事情是,數據必須已經被分類以供groupby使用。 – thefourtheye

+0

@thefourtheye是的,你是對的。謝謝。我修改了我的示例。 – wolfrevo