Splitting a list of dictionaries into several lists of dictionaries
This one is O(n log n)
because of the sort, but I wouldn't worry too much unless there are a lot of items in the list.
It the list is already sorted by event, you can skip the sort of course.
>>> from operator import itemgetter
>>> from itertools import groupby
>>> d=[{'event': 0, 'voltage': 1, 'time': 0},
... {'event': 0, 'voltage': 2, 'time': 1},
... {'event': 1, 'voltage': 1, 'time': 2},
... {'event': 1, 'voltage': 2, 'time': 3},
... {'event': 2, 'voltage': 1, 'time': 4},
... {'event': 2, 'voltage': 2, 'time': 5}]
>>> groupby(sorted(d, key=itemgetter('event')), key=itemgetter('event'))
<itertools.groupby object at 0xb78138c4>
>>> for x in _:
... print x[0], list(x[1])
...
0 [{'time': 0, 'event': 0, 'voltage': 1}, {'time': 1, 'event': 0, 'voltage': 2}]
1 [{'time': 2, 'event': 1, 'voltage': 1}, {'time': 3, 'event': 1, 'voltage': 2}]
2 [{'time': 4, 'event': 2, 'voltage': 1}, {'time': 5, 'event': 2, 'voltage': 2}]
use defaultdict
import collections
result = collections.defaultdict(list)
for d in dict_list:
result[d['event']].append(d)
result_list = result.values() # Python 2.x
result_list = list(result.values()) # Python 3
This way, you don't have to make any assumptions about how many different events there are or if there are any events missing.
This gives you a list of lists. If you want a dict
indexed by event, I would probably use dict(d)
if you plan on doing any random access.
As far as constructing a bunch of individual lists, I think that that's a bad idea. It will necessitate creating them as globals or using eval
(or getting hacky in some other way) unless you know exactly how many there are going to be which you claim not to. It's best to just keep them in a container.