合并具有列表ini的词典列表

2024-04-26 12:24:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我当前的列表:

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

任何其他更有效的方法或可能是一些内置的功能,我不知道。你知道吗

附言:秩序很重要!你知道吗


Tags: andtheinaddid列表newfor
3条回答

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]}]
>>>

您可以使用^{}'id'对原始list进行排序和分组,并为每个组累积'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)
]

^{}是您的朋友:

(我们应该使用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})

相关问题 更多 >