优化字典列表遍历代码:高效提取指定ID的id与name字段
优化嵌套字典列表解析的冗余代码
需求:当列表中条目的id匹配指定值(如123)时,输出包含该id和对应who列表中name字段的字典列表,格式示例:[{"id": 123}, {'name': 'bob'}]
原冗余代码
list1 = [{"id": 123, "job": "nurse", "who":[{"user": "bob_user", "name": "bob"}]}, {"id": 456, "job": "teacher", "who":[{"user": "jim_user", "name": "jim"}]}] list2 = [] keys = ["id", "who"] for items in list1: if items['id'] == 123: for key in keys: if key == "who": for values in items[key]: for count in values: if count == "name": list2.append({key : values[count]}) else: list2.append({key : items[key]}) print(list2)
优化方案1:简化嵌套逻辑,提升可读性
list1 = [{"id": 123, "job": "nurse", "who":[{"user": "bob_user", "name": "bob"}]}, {"id": 456, "job": "teacher", "who":[{"user": "jim_user", "name": "jim"}]}] target_id = 123 result = [] # 遍历列表找到匹配id的条目 for item in list1: if item["id"] == target_id: # 直接添加id字段 result.append({"id": item["id"]}) # 遍历who列表,提取name字段 for who_item in item["who"]: result.append({"name": who_item["name"]}) # 找到目标后立即退出循环,避免无效遍历 break print(result)
优化点:
- 砍掉多余嵌套:原代码有4层循环嵌套,优化后最多2层,逻辑一目了然
- 直接取值代替遍历判断:原代码循环
who里的所有键再判断是否是name,现在直接通过键名取值,效率更高 - 提前终止循环:找到目标条目后用
break跳出,不用遍历剩余无关条目 - 变量命名更直观:把
items、values这类模糊命名改成item、who_item,可读性提升
优化方案2:用内置函数进一步简化代码
list1 = [{"id": 123, "job": "nurse", "who":[{"user": "bob_user", "name": "bob"}]}, {"id": 456, "job": "teacher", "who":[{"user": "jim_user", "name": "jim"}]}] target_id = 123 # 用next()快速定位第一个匹配的条目,找不到则返回None target_item = next((item for item in list1 if item["id"] == target_id), None) result = [] if target_item: result.append({"id": target_item["id"]}) # 用列表推导式批量生成name字典,再用extend()添加到结果 result.extend([{"name": who["name"]} for who in target_item["who"]]) print(result)
优化点:
- 用
next()替代循环找目标:更简洁地获取第一个匹配条目,省去手动写break的步骤 - 列表推导式+extend:批量处理
who列表中的name字段,代码更紧凑
内容的提问来源于stack exchange,提问作者shxpark
相关产品推荐
相关产品推荐

