[英]Add elements of two list of dictionaries based on a key value pair match
給定n個以m個字典為元素的列表,我想產生一個新列表,其中包含一組連接的字典。
l1 = [{"index":'a', "b":2,'c':9}, {"index":'b', "b":3,"c":5}, {"index":'c', "b":8,"c":8}]
l2 = [{"index":'a', "b":4,'c':8}, {"index":'b', "b":9,"c":10},{"index":None, "b":11,"c":10}]
我想產生一個聯合列表:
l3 = [{"index":'a', "b":6, "c":17},
{"index":'b', "b":12, "c":15},
{"index":'c', "b":8, "c":8},
{"index":None, "b":11,"c":10}]
我有一個可以合並兩個列表的方法。 但是正如您在上面看到的,我也希望添加元素。
def merge_lists(l1, l2, key):
merged = {}
for item in l1+l2:
if item[key] in merged:
merged[item[key]].update(item)
else:
merged[item[key]] = item
return [val for (_, val) in merged.items()]
l3 = merge_lists(l1,l2,'index')
在Python中最有效的方法是什么?
您可以輕松地將Counter
用於類似這樣的事情...
from collections import defaultdict, Counter
def merge_lists(l1, l2):
d = defaultdict(Counter)
for sdict in l1 + l2:
counter = Counter(sdict)
d[counter.pop('index')] += counter
lists = []
for k, v in d.items():
result = dict(v)
result['index'] = k
lists.append(result)
return lists
l1 = [{"index":'a', "b":2,'c':9}, {"index":'b', "b":3,"c":5}, {"index":'c', "b":8,"c":8}]
l2 = [{"index":'a', "b":4,'c':8}, {"index":'b', "b":9,"c":10},{"index":None, "b":11,"c":10}]
print(merge_lists(l1, l2))
添加Counter
實例的好處在於,它幾乎可以完成您所期望的工作。 如果一個計數器沒有鍵,則它不會加總和,但是,如果兩個計數器都具有給定鍵,則將它們的值相加並用作該鍵的結果值。
請注意,合並列表的順序是任意的(基於defaultdict
的順序)。 如果您需要以某種方式保留順序,則可以sort
事實進行sort
,也可以創建默認的有序字典,該字典將根據l1
或l2
首次顯示index
的時間保留順序:
class DefaultOrderedDict(collections.OrderedDict):
def __init__(self, default_factory, *args, **kwargs):
self.default_factory = default_factory
super(DefaultOrderedDict, self).__init__(*args, **kwargs)
def __missing__(self, key):
self[key] = self.default_factory()
return self[key]
(在ActiveState和StackOverflow上還有更多“完整的”默認有序字典,但是這個簡單的字典應該可以解決您遇到的問題)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.