一尘不染

Python:将字典中的列表项分组

algorithm

我想从词典列表中生成字典,并按某些键的值将列表项分组,例如:

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')))

我想知道哪种选择最有效?

有没有更多的pythonic / concise或更好的方法来实现这一目标?


阅读 211

收藏
2020-07-28

共1个答案

一尘不染

您要通过列表元素的“
a​​”键的值对输入列表进行分组是否正确?如果是这样,您的第一种方法是最好的,是一个小的改进,请使用dict.setdefault

res = {}
for item in l:
    res.setdefault(item['a'], []).append(item)
2020-07-28