遍历字典列表生成新键字典列表时仅获最后元素的问题求助
问题解决:遍历字典列表生成新字典列表
问题描述
需要遍历一个字典列表,提取指定键的取值,生成包含新键名的字典列表。
输入数据
data = [ {'place': 'San Jose', 'seq': 1}, {'place': 'San Diego', 'seq': 2}, {'place': 'San Fransisco', 'seq': 3} ]
现有代码
post_obj = [] if len(data) > 0: for id in data: post_obj = [ { "city": id["place"], "display": id["seq"] } ] else: post_obj["areas"] = []
当前错误输出
仅得到最后一个元素:
[{'cityName': 'Inline', 'displayOrder': 3}]
期望输出
包含所有元素的新字典列表:
[{'cityName': 'San Jose', 'displayOrder': 1}, {'cityName': 'San Diego', 'displayOrder': 2}, {'cityName': 'San Fransisco', 'displayOrder': 3}]
错误原因分析
- 循环中覆盖列表而非追加:每次循环都直接给
post_obj赋值为只包含当前元素的新列表,之前的元素会被覆盖,最终只剩最后一次循环的结果。 - else分支错误操作:
post_obj初始是列表,不能通过post_obj["areas"]的方式给列表添加键,这会触发类型错误。 - 键名不匹配:现有代码里用的是
"city"和"display",但期望输出的键名是"cityName"和"displayOrder",这也是需要修正的点。
修正后的代码
基础循环写法
post_obj = [] if len(data) > 0: for item in data: # 变量名改为item更符合语义,避免和内置id冲突 post_obj.append({ "cityName": item["place"], "displayOrder": item["seq"] }) else: # 若需要空列表,直接保持post_obj为[]即可,可按需调整 post_obj = []
更简洁的列表推导式写法
如果不需要复杂的条件判断,直接用列表推导式更高效:
post_obj = [{"cityName": item["place"], "displayOrder": item["seq"]} for item in data]
验证输出
运行修正后的代码,会得到期望的输出:
[{'cityName': 'San Jose', 'displayOrder': 1}, {'cityName': 'San Diego', 'displayOrder': 2}, {'cityName': 'San Fransisco', 'displayOrder': 3}]
内容的提问来源于stack exchange,提问作者Joe14_1990
相关产品推荐
相关产品推荐

