请求排查从字典列表中匹配键值筛选目标字典的代码问题
问题排查与解决方案
看起来你现在需要从字典列表里筛选出sqlOperations中type为CreateTable的子字典,但现有代码没达到预期,我来帮你捋捋问题出在哪,以及怎么修正。
现有代码的核心问题
先看你写的代码片段:
for i in json_data: logger.debug("I is :: {} ".format(type(i))) sql_operations = i['sqlOperations'] for j in sql_operations: logger.debug("J is :: {} ".format(type(j))) for k,v in j.items(): if k == 'operationType' and v == 'REPLACE View': logger.debug("Key is {} and Item is {}".format(k,v))
这里有几个明显的问题:
- 键名不匹配:你要筛选的是
type键,但代码里判断的是operationType,和输入数据里的键完全对不上。 - 目标值错误:你需要的是
CreateTable类型,但代码里判断的是'REPLACE View',和预期筛选的内容不符。 - 没有收集结果:代码只是打印了日志,但没有把符合条件的字典收集起来,自然输出不了预期的结果数组。
修正后的代码
针对你的需求,我们可以调整代码逻辑,直接筛选并收集符合条件的项:
# 假设json_data是你的输入列表 result = [] for item in json_data: # 遍历每个字典里的sqlOperations数组 for operation in item['sqlOperations']: # 判断type是否为CreateTable if operation.get('type') == 'CreateTable': result.append(operation) # 打印或返回结果 print(result)
如果想用更简洁的列表推导式,也可以写成:
result = [op for item in json_data for op in item['sqlOperations'] if op.get('type') == 'CreateTable']
代码解释
- 我们先初始化一个空列表
result用来存放符合条件的字典。 - 外层循环遍历输入列表里的每个主字典,取出其中的
sqlOperations数组。 - 内层循环遍历
sqlOperations里的每个子字典,判断type键的值是否为CreateTable,如果是就添加到result里。 - 使用
operation.get('type')而不是直接operation['type']是为了避免如果某个子字典没有type键时抛出KeyError,让代码更健壮。
这样运行后,就能得到你想要的预期输出啦。
内容的提问来源于stack exchange,提问作者1stenjoydmoment
相关产品推荐
相关产品推荐

