合并多书籍字典为嵌套字典遇KeyError,求嵌套查询方法
解决书籍字典合并与嵌套查询问题
咱们先梳理下你的核心需求:既要保留单独操作各字段字典的灵活性(比如单独打印所有作者),又要能按书籍ID快速查询完整信息或特定字段,还要解决遍历出现的KeyError问题。下面给出一套实用的解决方案:
1. 构建嵌套字典的最优方式
我们可以创建一个以书籍ID为顶层键的嵌套字典,每个ID对应的值是包含该书籍所有详情的子字典。这样既保留了原有的分字段字典(方便单独操作),又能实现你想要的嵌套查询:
# 原有的分字段字典(注意把length改成lengths,避免和Python内置函数重名) books = [1, 2] titles = {1: 'sum_title', 2: 'other_title'} authors = {1: 'sum_author', 2: 'other_author'} lengths = {1: 100, 2: 200} chapters = {1: 10, 2: 20} # 构建嵌套字典,同时加入KeyError防护 book_details = {} for book_id in books: # 先检查当前ID是否在所有字段字典中都存在,避免报错 if all(book_id in d for d in [titles, authors, lengths, chapters]): book_details[book_id] = { "title": titles[book_id], "author": authors[book_id], "length": lengths[book_id], "chapters": chapters[book_id] } else: print(f"提示:书籍ID {book_id} 缺失部分字段,已跳过处理")
最终得到的book_details结构是这样的:
{ 1: { 'title': 'sum_title', 'author': 'sum_author', 'length': 100, 'chapters': 10 }, 2: { 'title': 'other_title', 'author': 'other_author', 'length': 200, 'chapters': 20 } }
2. 实现嵌套查询的操作示例
现在你可以轻松完成各种查询需求:
- 查询书籍1的作者:
book_details[1]['author']→ 返回'sum_author' - 查询书籍2的总章节数:
book_details[2]['chapters']→ 返回20 - 获取书籍1的完整信息:
book_details[1]→ 返回该书籍的所有字段组成的字典
3. 保留单独操作分字段字典的能力
原有的titles、authors等字典完全保留,你可以继续单独操作它们:
- 打印所有作者:
print(authors.values())→ 返回dict_values(['sum_author', 'other_author']) - 修改某本书的标题:直接修改
titles[1] = 'new_sum_title',如果需要同步到嵌套字典,重新执行一次构建逻辑,或者直接修改book_details[1]['title']即可
4. 解决KeyError的关键细节
你之前的代码出现KeyError,大概率是books列表里存在某个ID,在某个分字段字典中没有对应的键。上面的代码用all(...)做了前置检查,会自动跳过缺失字段的ID;如果你希望提前发现数据问题,可以换成断言强制检查:
for book_id in books: assert book_id in titles, f"错误:书籍ID {book_id} 在titles字典中不存在" assert book_id in authors, f"错误:书籍ID {book_id} 在authors字典中不存在" # 其他字段的断言检查 book_details[book_id] = { "title": titles[book_id], "author": authors[book_id], "length": lengths[book_id], "chapters": chapters[book_id] }
5. 转为JSON格式的方法
如果需要把嵌套字典转成JSON,直接用json模块即可:
import json json_output = json.dumps(book_details, indent=4) print(json_output)
输出的JSON格式规整,适合存储或传输。
内容的提问来源于stack exchange,提问作者Linux Lover
相关产品推荐
相关产品推荐

