我有兩個 python 字典串列:
l1 = [{"id":1, "name":"A"}, {"id":2, "name":"B"}]
l2 = [{"id":1, "full_name":"Alfred"}, {"id":2, "full_name":"Barbara"}]
我的目標是列出如下串列:
l3 = [{"id":1, "full_name":"Alfred", "name":"A"}, {"id":2, "full_name":"Barbara", "name":"B"}]
我想我可以使用嵌套回圈來做到這一點,但我相信應該可以用一種更好、更 Pythonic 的方式來做到這一點。
uj5u.com熱心網友回復:
from collections import defaultdict
res = defaultdict(dict)
for a, b in zip(l1, l2):
key1 = a['id']
key2 = b['id']
res[key1].update(a)
res[key2].update(b)
print(list(res.values())) # [{'id': 1, 'name': 'A', 'full_name': 'Alfred'}, {'id': 2, 'name': 'B', 'full_name': 'Barbara'}]
盡管這將在一次迭代中起作用,但您可能希望稍微簡化底層資料結構以使其更易于使用。
uj5u.com熱心網友回復:
假設您sort事先按 ID 值列出了串列,并且兩個串列中的 ID 值相同(只是順序可能不同),我們可以通過簡單的zip呼叫來完成。
l1.sort(key=lambda x: x["id"])
l2.sort(key=lambda x: x["id"])
def merge(x, y):
a = {}
a.update(x)
a.update(y)
return a
l3 = [merge(x, y) for x, y in zip(l1, l2)]
請注意,在 Python 3.9 及更高版本中,mergeis simple |,因此我們可以撰寫
l3 = [x | y for x, y in zip(l1, l2)]
并完全消除對輔助函式的需求。
uj5u.com熱心網友回復:
l1 = [{"id":1, "name":"A"}, {"id":2, "name":"B"}]
l2 = [{"id":1, "full_name":"Alfred"}, {"id":2, "full_name":"Barbara"}]
print([{**i,**j} for i in l1 for j in l2 if i["id"] ==j["id"]])
結果:
[{'id': 1, 'name': 'A', 'full_name': 'Alfred'}, {'id': 2, 'name': 'B', 'full_name': 'Barbara'}]
你可以嘗試這樣的事情,你可能已經知道了......看到更多的pythonic會很有趣:)
uj5u.com熱心網友回復:
我建議在創建輸入資料時對其進行重組,以便這id是每個特定人員的實際識別符號。如果您id為外部字典創建鍵值,則可以通過每個映射一次完成。
from collections import defaultdict
l1 = {1:{"name":"A"}, 2:{"name":"B"}, 3:{"name":"C"}}
l2 = {1:{"full_name":"Alfred"}, 2:{"full_name":"Barbara"}}
result = defaultdict(dict)
for li in [l1, l2]:
for k,v in li.items():
result[k].update(v)
print(result)
(我"id":value從資料中洗掉了它,因為這種形式的資料是多余的,但如果你真的需要它,將它重新添加應該沒問題。)
uj5u.com熱心網友回復:
使用 id 作為識別符號,創建新的字典并更新它們 - 代碼中的更多注釋。
不需要排序,不“均勻”的源串列內部字典也將被保留
l1 = [{"id":1, "name":"A"}, {"id":2, "name":"B"}]
l2 = [{"id":1, "full_name":"Alfred"}, {"id":2, "full_name":"Barbara"}]
# intermediate dictionary that keeps all collected inner dicts at the id
d = {}
# go through both lists
for inner_d in l1 l2:
# create a new empty dict under the id if needed
what = d.setdefault(inner_d["id"], {})
# add all things from the inner dict
what.update(inner_d.items())
as_list = list(d.values())
print(as_list)
輸出:
[{'id': 1, 'name': 'A', 'full_name': 'Alfred'},
{'id': 2, 'name': 'B', 'full_name': 'Barbara'}]
uj5u.com熱心網友回復:
在一行中(假設 id 欄位具有完美的 1:1 映射):
result = [x | y for x, y in zip(sorted(l1, key = lambda x: x['id']), sorted(l2, key = lambda x: x['id']) )]
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/451055.html
標籤:Python python-3.x 字典
上一篇:更新字典python中的鍵名
下一篇:檢查字典中的多個kv
