合并列表init的词典列表

时间:2016-05-09 07:05:07

标签: python python-2.7

我目前的清单:

my_list = [
   {'id': 1, 'val': [6]},
   {'id': 2, 'val': [7]},
   {'id': 3, 'val': [8]},
   {'id': 2, 'val': [9]},
   {'id': 1, 'val': [10]},
]

期望的输出:

my_list = [
   {'id': 1, 'val': [6, 10]},
   {'id': 2, 'val': [7, 9]},
   {'id': 3, 'val': [8]},
]

到目前为止我尝试了什么:

    my_new_list = []
    id_set = set()

    for d in my_list:
        if d['id'] not in id_set:
            id_set.add(d['id'])
            temp = {'id': d['id'], 'val': d['val']}
            my_new_list.append(temp)
        else:
             # loop over the new list and find the dict which already have d['id'] and update by appending value
             # but this is not efficient

任何其他更有效的方法,或者可能是我不知道的一些内置功能。<​​/ p>

PS:订单很重要!

3 个答案:

答案 0 :(得分:4)

.setdefault()是你的朋友:

(我们应该使用collections.OrderedDict来记住首次插入密钥的顺序。)

>>> import collections

>>> result = collections.OrderedDict()
>>> for d in my_list:
...     result.setdefault(d["id"], []).extend(d["val"])

>>> lst = []
>>> for k, v in result.items():
...     lst.append({"id": k, "val": v})

答案 1 :(得分:1)

ozgur相同,但使用collections.defaultdict

>>> from collections import defaultdict
>>> d = defaultdict(list)
>>> for dd in my_list:
        d[dd['id']].extend(dd['val'])
>>> d
defaultdict(<type 'list'>, {1: [6, 10], 2: [7, 9], 3: [8]})
>>>
>>> lst = []
>>> for k,v in d.iteritems():
        lst.append({'id':k, 'val':v})

>>> lst
[{'id': 1, 'val': [6, 10]}, {'id': 2, 'val': [7, 9]}, {'id': 3, 'val': [8]}]
>>>

答案 2 :(得分:0)

您可以使用itertools.groupbylist对原始'id'进行排序和分组,并为每个群组累积'val'

from itertools import groupby

key_fnc = lambda d: d['id']
result = [
    {'id': k, 'val': sum([d['val'] for d in g], [])} 
        for k, g in groupby(sorted(my_list, key=key_fnc), key=key_fnc)
]