簡體   English   中英

根據特定鍵合並兩個詞典列表

[英]Merge two list of dictionaries based on specific key

好的,所以我有這個代碼。

data1 = [
    {'Id': 1}, 
    {'Id': 2}
]
data2 = [
    {'Id': 1, 'score': 100, 'testdata': 333}, 
    {'Id': 2, 'score': 200, 'testdata': 555}, 
    {'Id': 3, 'score': 300, 'testdata': 444}
]

expectedData = [
        {'Id': 1, 'Score': 100}, 
        {'Id': 2, 'Score': 200}
    ]


def merge_lists(data1, data2, key):
    merged = {}
    for item in data1+data2:
        if item[key] in merged:
            merged[item[key]].update(item)
        else:
            merged[item[key]] = item
    return [val for (_, val) in merged.items()]

merged = merge_lists(data1, data2, 'Id')

print merged

問題是,這會將data2中的每個值(不是'id')合並到data1中。 我只希望它合並鍵'得分',但我真的不知道如何僅指定該鍵。 我已經嘗試了多個其他條件語句來指定'score'鍵。 但我似乎無法得到任何工作。

謝謝你的幫助

你可以像這樣工廠

data1 = [
    {'Id': 1},
    {'Id': 2}
]
data2 = [
    {'Id': 1, 'score': 100, 'testdata': 333},
    {'Id': 2, 'score': 200, 'testdata': 555},
    {'Id': 3, 'score': 300, 'testdata': 444}
]

def get_score(list_of_dict, id_value):

    for dict_ in list_of_dict:
        if dict_["Id"] == id_value:
            return {"score": dict_["score"]}

res = data1.copy()

for dict_ in res:
    dict_.update(get_score(data2, dict_["Id"]))

print(res)
# [{'score': 100, 'Id': 1}, {'score': 200, 'Id': 2}]

這里的代碼將以您想要的方式合並。 請注意,如果data2有多個列表使用正確的匹配鍵,則只能找到第一個列表。

data1 = [
    {'Id': 1}, 
    {'Id': 2},
]

data2 = [
    {'Id': 1, 'score': 100, 'testdata': 333}, 
    {'Id': 2, 'score': 200, 'testdata': 555}, 
    {'Id': 3, 'score': 300, 'testdata': 444},
]

def merge_lists(data1, data2, key):
    result = []
    for d1 in data1:
        val = d1[key]
        dnew = {key: val}
        for d2 in data2:
            if d2[key] == val:
                dnew['score'] = d2['score']
                break
        else:
            raise KeyError('No match for %r: %s' % (key, val))
        result.append(dnew)
    return result

merged = merge_lists(data1, data2, 'Id')
print merged

產量

[{'score': 100, 'Id': 1}, {'score': 200, 'Id': 2}]

如果我們將data1更改為

data1 = [
    {'Id': 1}, 
    {'Id': 5},
    {'Id': 2},
]

然后我們得到這個輸出:

Traceback (most recent call last):
  File "./qtest.py", line 45, in <module>
    merged = merge_lists(data1, data2, 'Id')
  File "./qtest.py", line 41, in merge_lists
    raise KeyError('No match for %r: %s' % (key, val))
KeyError: "No match for 'Id': 5"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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