簡體   English   中英

根據鍵值對匹配,添加兩個字典列表的元素

[英]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 ,也可以創建默認的有序字典,該字典將根據l1l2首次顯示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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM