Reputation: 4014
I have a list that is something like this:
[{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)]}
I want to slot the entire thing into slots of 3 hours, such that it can be displayed as:
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
and so on.. I don't quite understand how to go about it. Can anyone help with some hints, or some algo, for me to understand how to do this?
Upvotes: 2
Views: 1140
Reputation: 7303
you can also use groupby
(from itertools import groupby
) with list comprehension:
[(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])]
Produces following output:
[(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)])]
using your data as follows:
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
is the value of your dictionary's day key. As pointed out by @thefourtheye This list has to be sorted to work with groupby
:
dictionary_list = [{datetime.date(2014, 2, 13): [datetime.time(13, 53, 53), ...
timelist = dictionary_list[0].items()[0][1]
timelist.sort()
Upvotes: 2
Reputation: 239483
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)
Output
{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)]}}
Upvotes: 2