在第二个id Python上连接

2024-04-20 01:27:32 发布

您现在位置: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'}])

Tags: keynameid字典namesmergeditemlevel
2条回答

考虑您真正想要做的:将与每个类别关联的级别添加到namesdict中。因此,首先,创建从类别到关联级别的映射:

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

然后是names列表中每个dict的一个简单转换:

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'}]

创建从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]

相关问题 更多 >