Python遍历字典列表提取值子集出错,求正确循环实现方法
问题:提取字典列表中指定键生成新字典列表
原数据
"values": [ { "a": 1, "b": 2, "center code here": 3, "d": 4, }, { "a": 1, "b": 2, "c": 3, "d": 4, }, { "a": 1, "b": 2, "c": 3, "d": 4, }, { "a": 1, "b": 2, "c": 3, "d": 4 } ]
注:实际代码中data_list对应上述"values"的列表部分
错误代码
listx = [a,b] dict2 = {} for d in data_list: for v,x in d.items(): if v in listx: dict2[v] = (x) print(len(dict2))
预期结果
"values": [ { "a": 1, "b": 2 }, { "a": 1, "b": 2 }, { "a": 1, "b": 2 }, { "a": 1, "b": 2 } ]
错误原因
listx = [a,b]中的a、b未加引号,会被当作未定义变量,正确写法应为listx = ['a','b']- 仅使用单个字典
dict2存储结果,每次循环都会覆盖该字典的键值,最终只会保留最后一个元素的指定键值,无法生成包含多个字典的列表 - 没有创建列表来收集每个处理后的字典
正确实现方法
方法1:基础循环写法
listx = ['a', 'b'] result = [] # 用列表存储每个处理后的字典 for d in data_list: new_dict = {} for key in listx: # 仅当原字典存在该键时添加,避免KeyError if key in d: new_dict[key] = d[key] result.append(new_dict) # 输出结果 print(result)
方法2:列表推导式(简洁写法)
如果确定所有字典都包含listx中的键,可以用更简洁的列表推导式:
listx = ['a', 'b'] result = [{key: d[key] for key in listx} for d in data_list] print(result)
方法3:处理键不存在的情况(更健壮)
如果部分字典可能缺少listx中的键,用dict.get()避免报错,不存在的键会返回None或指定默认值:
listx = ['a', 'b'] result = [{key: d.get(key) for key in listx} for d in data_list] # 或者指定默认值,比如空字符串 # result = [{key: d.get(key, '') for key in listx} for d in data_list] print(result)
内容的提问来源于stack exchange,提问作者J W
相关产品推荐
相关产品推荐

