You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何遍历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)

使用说明

  1. 把load_data_from_csv里的字段名改成你CSV文件实际的列名(比如如果你的水源类型字段叫type,就把row['water_type']改成row['type'])
  2. 修改condition_has_groundwater这类条件函数,换成你实际需要的判断逻辑
  3. 运行代码后,会直接打印报告,同时也会生成一个Markdown格式的报告文件

内容的提问来源于stack exchange,提问作者Alicia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:25:00