如何在匹配特定值时将字典数组的指定值合并到另一字典数组
合并两个字典数组:匹配特定值后合并指定字段
嘿,我来帮你搞定这个需求!核心思路是先把作者数组转换成以writer_id为键的映射字典,这样能高效匹配对应的作者信息,再遍历书籍数组把需要的字段合并进去。
先补全你的示例数据(假设authors里包含writer_id字段)
books = [ {'writer_id': '123-456-789', 'index': None, 'title': 'Yellow Snow'}, {'writer_id': '888-888-777', 'index': None, 'title': 'Python for Dummies'}, {'writer_id': '999-121-223', 'index': 'Foo', 'title': 'Something Else'} ] authors = [ {'roles': ['author'], 'profile': 'John Doe', 'writer_id': '123-456-789'}, {'roles': ['author', 'editor'], 'profile': 'Jane Smith', 'writer_id': '888-888-777'}, {'roles': ['contributor'], 'profile': 'Bob Brown', 'writer_id': '999-121-223'} ]
实现步骤与代码
- 构建作者映射字典:把authors数组转成以
writer_id为键的字典,这样查找作者信息的时间复杂度是O(1),比嵌套循环高效得多 - 遍历书籍数组合并字段:根据每个书籍的
writer_id找到对应的作者,将需要的字段(比如roles、profile)合并到书籍字典中
方式1:直接修改原books数组
# 构建作者映射 author_map = {auth['writer_id']: auth for auth in authors} # 遍历书籍合并字段 for book in books: writer_id = book['writer_id'] if writer_id in author_map: # 把需要的字段合并进去,这里以roles和profile为例 book['roles'] = author_map[writer_id]['roles'] book['profile'] = author_map[writer_id]['profile'] # 查看合并结果 print(books)
方式2:创建新数组,不修改原数据(更安全)
如果你不想改动原有的books数组,可以创建新的字典列表:
author_map = {auth['writer_id']: auth for auth in authors} # 生成合并后的新数组 merged_books = [] for book in books: writer_id = book['writer_id'] # 用字典解包合并,优先保留book里的字段(如果有重复键的话) merged_book = {**book, **author_map.get(writer_id, {})} merged_books.append(merged_book) print(merged_books)
结果说明
不管用哪种方式,最终你都会得到包含作者信息的书籍字典数组,比如第一个书籍会变成:
{'writer_id': '123-456-789', 'index': None, 'title': 'Yellow Snow', 'roles': ['author'], 'profile': 'John Doe'}
如果某个书籍的writer_id在authors里找不到,那对应的字段会保持原样(方式1)或者不新增字段(方式2),你可以根据需求调整逻辑,比如添加默认值。
内容的提问来源于stack exchange,提问作者rg88
相关产品推荐
相关产品推荐

