加入非唯一的第二个ID - Python



我正在尝试将一个字典连接到另一个字典。我有两把钥匙;一个是独一无二的,另一个不是独一无二的。我想在非唯一键上连接信息,并将所有信息保留为唯一键,即唯一 id 的数量必须保持不变。

关于我如何实现这一目标的任何想法?

这是第一本字典:

names = [
{'id': '1', 'name': 'Peter', 'category_id': '25'}, 
{'id': '2', 'name': 'Jim', 'category_id': '20'}, 
{'id': '3', 'name': 'Toni', 'category_id': '20'}
]

这是第二本字典:

categories = [
{'category_id': '25', 'level': 'advanced'}, 
{'category_id': '20', 'level': 'beginner'}
]

这就是我想要实现的目标:

all = [
{'id': '1', 'name': 'Peter', 'category_id': '25', 'level': 'advanced'}, 
{'id': '2', 'name': 'Jim', 'category_id': '20', 'level': 'beginner'}, 
{'id': '3', 'name': 'Toni', 'category_id': '20', 'level': 'beginner'}
]

编辑:

names = [
{'id': '1', 'name': 'Peter', 'category_id': '25'}, 
{'id': '2', 'name': 'Jim', 'category_id': '20'}, 
{'id': '3', 'name': 'Toni', 'category_id': '20'}
]
categories = [
{'category_id': '25', 'level': 'advanced'}, 
{'category_id': '20', 'level': 'beginner'}
]
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 merged.values()
courses = merge_lists(names, categories, 'category_id')
print(courses)

给:

([{'id': '1', 'name': 'Peter', 'category_id': '25', 'level': 'advanced'}, 
{'id': '3', 'name': 'Toni', 'category_id': '20', 'level': 'beginner'}])

创建从category_id到其他字段的映射,然后将字典组合在一个循环中,例如:

cat = {d["category_id"]: d for d in categories}
res = []
for name in names:
x = name.copy()
x.update(cat[name["category_id"]])  
res.append(x)

在Python 3.5+中,你可以使用很酷的新语法:

cat = {d["category_id"]: d for d in categories}
res = [{**name, **cat[name["category_id"]]} for name in names]

考虑一下你真正想做的事情:将与每个类别关联的级别添加到names字典中。因此,首先,创建从类别到关联级别的映射:

cat_dict = {d['category_id']: d['level'] for d in categories}

然后,对names列表中的每个字典进行微不足道的转换:

for d in names:
d['level'] = cat_dict[d['category_id']]

生成的names列表为:

[{'category_id': '25', 'id': '1', 'level': 'advanced', 'name': 'Peter'},
{'category_id': '20', 'id': '2', 'level': 'beginner', 'name': 'Jim'},
{'category_id': '20', 'id': '3', 'level': 'beginner', 'name': 'Toni'}]

最新更新