我有兩個清單:
lst1 = [{"name": "Hanna", "age":3},
{"name": "Kris", "age": 18},
{"name":"Dom", "age": 15},
{"name":"Tom", "age": 5}]
第二個包含name不同鍵下的一些上述鍵值:
lst2 = [{"username": "Kris", "Town": "Big City"},
{"username":"Dom", "Town": "NYC"}]
我想將它們與結果合并:
lst = [{"name": "Hanna", "age":3},
{"name": "Kris", "age": 18, "Town": "Big City"},
{"name":"Dom", "age": 15, "Town": "NYC"},
{"name":"Tom", "age":"5"}]
最簡單的方法是一個接一個(對于 lst1 中的每個元素,檢查它是否存在于 lst2 中),但是對于大串列,這是非常無效的(我的串列每個都有幾百個元素)。實作這一目標的最有效方法是什么?
uj5u.com熱心網友回復:
為避免一次又一次地迭代另一個串列,您可以先構建名稱索引。
lst1 = [{"name": "Hanna", "age":3},
{"name": "Kris", "age": 18},
{"name":"Dom", "age": 15},
{"name":"Tom", "age": 5}]
lst2 = [{"username": "Kris", "Town": "Big City"},
{"username":"Dom", "Town": "NYC"}]
name_index = { dic['username'] : idx for idx, dic in enumerate(lst2) if dic.get('username') }
for dic in lst1:
name = dic.get('name')
if name in name_index:
dic.update(lst2[name_index[name]]) # update in-place to further save time
dic.pop('username')
print(lst1)
uj5u.com熱心網友回復:
比使用串列更有效的一種方法是從lst1withname作為鍵創建一個中間字典,以便您搜索字典而不是串列。
d1 = {elem['name']: {k:v for k,v in elem.items() if k != 'name'} for elem in lst1}
for elem in lst2:
d1[elem['username']].update( {k:v for k,v in elem.items() if k != 'username'} )
lst = [{**{'name': k},**v} for k,v in d1.items()] # sorry Python 3.8 here
輸出:
[{'name': 'Hanna', 'age': 3}, {'name': 'Kris', 'age': 18, 'Town': 'Big City'}, {'name': 'Dom', 'age': 15, 'Town': 'NYC'}, {'name': 'Tom', 'age': 5}]
- 編輯為只有一個中間字典
uj5u.com熱心網友回復:
for d1, d2 in it.zip_longest(sorted(lst1, key=lambda d1: d1['name']), sorted(lst2*(len(lst1) - len(lst2)), key=lambda d2: d2['username'])):
print(d1, d2)
if d2 and d1['name'] == d2['username']:
print(f"{d1['name']} == {d2['username']}")
d1.update(d2)
del d1['username']
print(lst1)
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/525474.html
標籤:Python字典
