我想从词典列表中生成字典,并按某些键的值将列表项分组,例如:
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:
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或更好的方法来实现这一目标?
您要通过列表元素的“ a”键的值对输入列表进行分组是否正确?如果是这样,您的第一种方法是最好的,是一个小的改进,请使用dict.setdefault:
dict.setdefault
res = {} for item in l: res.setdefault(item['a'], []).append(item)