将字典列表拆分为多个字典列表

the*_*ame 14 python dictionary split list

我一直在打扰这一段时间无济于事......任何帮助都会非常感激.

我有:

[{'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},
...]
Run Code Online (Sandbox Code Playgroud)

我希望按照这样的事件分割那个词典列表(可以有任意多个事件):

list0 = [{'event': 0, 'voltage': 1, 'time': 0},
{'event': 0, 'voltage': 2, 'time': 1}]

list1 = [{'event': 1, 'voltage': 1, 'time': 2},
{'event': 1, 'voltage': 2, 'time': 3}]

list2 = [{'event': 2, 'voltage': 1, 'time': 4},
{'event': 2, 'voltage': 2, 'time': 5}]

listN = ...
Run Code Online (Sandbox Code Playgroud)

aar*_*ing 16

使用 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
Run Code Online (Sandbox Code Playgroud)

这样,您不必对有多少不同事件或是否有任何事件缺失做出任何假设.

这会为您提供列表清单.如果你想要一个dict索引的事件,我可能会使用dict(d)你计划做任何随机访问.

至于构建一堆个别列表,我认为这是一个坏主意.它必须将它们创建为全局或使用eval(或以其他方式获得hacky),除非你确切地知道你声称不会有多少.最好将它们放在容器中.


Joh*_*ooy 5

这是O(n log n)因为排序,但是除非列表中有很多项目,否则我不会太担心。

如果列表已按事件排序,则可以跳过该过程。

>>> 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}]
Run Code Online (Sandbox Code Playgroud)