我想从一个字典列表中生成一个新的字典,通过某个键的值对列表项进行分组,例如:
input_list = [
{'a':'tata', 'b': 'foo'},
{'a':'pipo', 'b': 'titi'},
{'a':'pipo', 'b': 'toto'},
{'a':'tata', 'b': 'bar'}
]
output_dict = {
'pipo': [
{'a': 'pipo', 'b': 'titi'},
{'a': 'pipo', 'b': 'toto'}
],
'tata': [
{'a': 'tata', 'b': 'foo'},
{'a': 'tata', 'b': 'bar'}
]
}
到目前为止,我发现有两种方法可以做到这一点。第一种方法只是遍历列表,在字典中为每个键值创建子列表,并将与这些键匹配的元素附加到子列表中:
l = [
{'a':'tata', 'b': 'foo'},
{'a':'pipo', 'b': 'titi'},
{'a':'pipo', 'b': 'toto'},
{'a':'tata', 'b': 'bar'}
]
res = {}
for e in l:
res[e['a']] = res.get(e['a'], [])
res[e['a']].append(e)
并且另一种使用 itertools.groupby
:
import itertools
from operator import itemgetter
l = [
{'a':'tata', 'b': 'foo'},
{'a':'pipo', 'b': 'titi'},
{'a':'pipo', 'b': 'toto'},
{'a':'tata', 'b': 'bar'}
]
l = sorted(l, key=itemgetter('a'))
res = dict((k, list(g)) for k, g in itertools.groupby(l, key=itemgetter('a')))
我想知道哪种选择最有效?
是否有更具Python风格/简洁或执行效率更高的方法来实现这个目标?
groupby
似乎是最好的选择,但我担心强制排序会比简单的for
循环增加不必要的复杂性。 - Erwan Queffélec