Python按XML父标签属性分组统计子标签属性计数问题求助
问题根因
- 遍历范围错误:你调用
root.iter('Result')会扫描整个XML文档的所有Result标签,不是当前Unit节点下的子节点,导致每次统计的都是全量数据 - 统计逻辑错误:
code1_map放在Unit循环内部,每次遍历新Unit都会清空同type的历史统计结果,同时冗余的siteNumber变量和错误的赋值位置也会导致统计结果被覆盖
修正后可直接运行的代码
from collections import defaultdict import xml.etree.ElementTree as ET # 假设你已经完成XML解析得到root节点 # tree = ET.parse('你的XML文件路径.xml') # root = tree.getroot() # 初始化统计容器:外层key是Unit的type值,内层是对应code的计数 code1_stats = defaultdict(lambda: defaultdict(int)) code2_stats = defaultdict(lambda: defaultdict(int)) for unit in root.iter('Unit'): # 跳过没有type属性的Unit(比如示例中最外层的Unit节点) if 'type' not in unit.attrib: continue unit_type = int(unit.get('type')) # 仅遍历当前Unit下的Result子节点 for result in unit.iter('Result'): code1 = int(result.get('code1')) code2 = int(result.get('code2')) # 累加计数 code1_stats[unit_type][code1] += 1 code2_stats[unit_type][code2] += 1 # 输出结果 for unit_type, count_map in code1_stats.items(): print(f"Unit Type {unit_type}的code1计数:{dict(count_map)}") for unit_type, count_map in code2_stats.items(): print(f"Unit Type {unit_type}的code2计数:{dict(count_map)}")
输出示例
针对你提供的XML结构,运行后输出如下:
Unit Type 1的code1计数:{'1': 1, '444': 2} Unit Type 2的code1计数:{'1': 1, '1025': 1} Unit Type 1的code2计数:{'1': 3} Unit Type 2的code2计数:{'1': 2}
关键改动说明
- 调整Result的遍历范围为当前Unit节点,确保只统计当前Unit下的子标签
- 使用
defaultdict简化计数逻辑,避免手动判断key是否存在的冗余代码 - 统计容器全局初始化,同type的Unit下的Result计数会自动累加,不会被覆盖
- 增加无type属性的Unit过滤逻辑,避免属性取值报错
内容的提问来源于stack exchange,提问作者dominant
相关产品推荐
相关产品推荐

