如何遍历Facility类对象成员并生成符合条件的设施列表?
没问题,我帮你搞定这个报告生成的需求!结合你已经搭建的Facility和WaterSource类结构,咱们可以分几步实现筛选+报告的功能:
第一步:明确筛选逻辑
首先得把你的"特定条件"落地成可执行的判断逻辑,比如常见的筛选场景有:
- 设施包含的水源数量≥N
- 存在某类水源(比如地下水)
- 所有水源的容量都超过某个阈值
我会在代码里给你几个示例,你可以直接改成自己需要的条件。
第二步:实现筛选与报告生成
先补全基础的类定义(如果你的类已经写好,直接替换成你的版本就行),然后写筛选函数和报告生成函数,最后整合起来:
完整代码
import csv class WaterSource: def __init__(self, source_id, water_type, capacity): self.source_id = source_id self.water_type = water_type self.capacity = capacity # 可根据你的CSV字段调整属性 def __repr__(self): return f"WaterSource(source_id='{self.source_id}', water_type='{self.water_type}', capacity={self.capacity})" class Facility: def __init__(self, facility_id): self.facility_id = facility_id self.records = [] # 存储WaterSource对象的列表 def add_water_source(self, source): self.records.append(source) def __repr__(self): return f"Facility(facility_id='{self.facility_id}', records={self.records})" def load_data_from_csv(csv_path): """从CSV文件加载数据到data字典,键为设施ID,值为Facility对象""" data = {} with open(csv_path, 'r', encoding='utf-8') as f: reader = csv.DictReader(f) for row in reader: facility_id = row['facility_id'] # 若设施未创建,先初始化 if facility_id not in data: data[facility_id] = Facility(facility_id) # 创建水源对象并添加到对应设施 water_source = WaterSource( source_id=row['source_id'], water_type=row['water_type'], capacity=int(row['capacity']) ) data[facility_id].add_water_source(water_source) return data def filter_facilities(data, condition_func): """ 筛选符合条件的设施 :param data: 存储Facility对象的字典 :param condition_func: 自定义条件函数,接收Facility对象,返回True/False :return: 符合条件的Facility列表 """ return [facility for _, facility in data.items() if condition_func(facility)] def generate_report(filtered_facilities): """生成Markdown格式的报告内容""" report = "# 设施筛选报告\n\n" if not filtered_facilities: report += "未找到符合条件的设施。\n" return report for idx, facility in enumerate(filtered_facilities, 1): report += f"## 设施 {idx}: {facility.facility_id}\n" report += f"- 关联水源总数: {len(facility.records)}\n" report += "### 水源详情:\n" for source in facility.records: report += f"- 水源ID: {source.source_id} | 类型: {source.water_type} | 容量: {source.capacity}\n" report += "\n" return report # 示例:自定义筛选条件 def condition_has_groundwater(facility): """筛选包含地下水水源的设施""" return any(source.water_type == "地下水" for source in facility.records) def condition_min_3_sources(facility): """筛选水源数量≥3的设施""" return len(facility.records) >= 3 # 主执行逻辑 if __name__ == "__main__": # 替换成你的CSV文件路径 data = load_data_from_csv("facilities_data.csv") # 选择你需要的筛选条件 target_facilities = filter_facilities(data, condition_has_groundwater) # 生成并输出报告 final_report = generate_report(target_facilities) print(final_report) # 可选:把报告写入文件 with open("facility_report.md", "w", encoding="utf-8") as f: f.write(final_report)
使用说明
- 把
load_data_from_csv里的字段名改成你CSV文件实际的列名(比如如果你的水源类型字段叫type,就把row['water_type']改成row['type']) - 修改
condition_has_groundwater这类条件函数,换成你实际需要的判断逻辑 - 运行代码后,会直接打印报告,同时也会生成一个Markdown格式的报告文件
内容的提问来源于stack exchange,提问作者Alicia
相关产品推荐
相关产品推荐

