Python如何筛选大型字典中符合指定属性条件的条目
大体积不动产地块数据筛选+防崩溃打印方案
你之前Spyder崩溃的核心原因是一次性将超量数据直接输出到控制台,控制台渲染大量内容时内存占用飙升直接卡死,只要控制打印节奏、避免一次性输出全量数据就能解决。
首先明确你的数据结构:parcels是由字典组成的列表,每个列表元素对应一个地块的全量属性,筛选的核心逻辑就是遍历列表,逐条目校验属性条件即可。
基础筛选实现
针对你提出的market_value > 250000且state_code = "A1"的筛选需求,注意Python中相等判断要用双等号==,单个等号是赋值符号,写在条件里会报错。另外加了键存在的容错逻辑,避免遇到缺字段的条目直接抛出KeyError:
# 存储符合条件的结果 filtered_parcels = [] for parcel in parcels: # 校验需要判断的两个字段是否存在,避免缺字段报错 if "market_value" in parcel and "state_code" in parcel: # 条件判断 if parcel["market_value"] > 250000 and parcel["state_code"] == "A1": filtered_parcels.append(parcel)
如果熟悉写法后,也可以用更简洁的列表推导式实现,效率和普通循环一致:
# p.get("key", 默认值) 是更简便的容错写法,键不存在时返回默认值不会报错 filtered_parcels = [ p for p in parcels if p.get("market_value", 0) > 250000 and p.get("state_code", "") == "A1" ]
防Spyder崩溃的打印方法
绝对不要直接执行print(parcels)或print(filtered_parcels)输出全量列表,几万条字典的文本渲染量会直接让控制台卡死,按以下步骤操作:
- 先输出匹配结果总数,这步数据量极小不会有任何问题:
print(f"共筛选到符合条件的地块:{len(filtered_parcels)} 条") - 根据匹配条数选择打印策略:
- 如果匹配结果在100条以内:逐条打印你关心的字段,不要直接打印整个字典对象,减少控制台渲染压力
for idx, parcel in enumerate(filtered_parcels, 1): print(f"=== 第{idx}条 ===") print(f"地址:{parcel['street_address']}") print(f"居住面积:{parcel['living_area']}") print(f"市场价值:{parcel['market_value']}") print(f"对应校区:{parcel['CAMPNAME']}\n") - 如果匹配结果超过100条:只打印前5-10条预览,全量结果直接导出为CSV文件本地查看,不要打印
import csv print("匹配结果超过100条,仅展示前5条预览,全量结果已存入filtered_parcels.csv") # 打印前5条预览 for parcel in filtered_parcels[:5]: print(f"{parcel['street_address']} | 市值:{parcel['market_value']}") # 全量结果写入CSV with open("filtered_parcels.csv", "w", newline="", encoding="utf-8") as f: writer = csv.DictWriter(f, fieldnames=parcels[0].keys()) writer.writeheader() writer.writerows(filtered_parcels)
- 如果匹配结果在100条以内:逐条打印你关心的字段,不要直接打印整个字典对象,减少控制台渲染压力
新手避坑提示
- 所有条件判断里的相等比较必须用
==,不要写单个= - 遍历大列表时不要在循环里加没必要的打印操作,会大幅降低运行速度
- 如果你的原始parcels数据是从文件读取的,不要每次运行脚本都重复打印原始数据加载信息
内容的提问来源于stack exchange,提问作者reputation_apologist
相关产品推荐
相关产品推荐

