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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 19:51:02