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

Python中如何高效计算命名元组集合单个字段的总和?

在Python中最简计算namedtuple单个字段总和的方法

需求很明确:计算一组TestResults namedtuple对象中failed字段的总和,预期结果为4。你已经用for循环实现了,但可以用更简洁高效的方式来完成。

方法一:sum() + 生成器表达式(推荐)

这是最简洁且可读性高的写法,Python内置的sum()函数配合生成器表达式可以直接完成求和:

from collections import namedtuple

TestResults = namedtuple('TestResults', ['failed', 'attempted'])

test_results = [
    TestResults(0, 5),
    TestResults(3, 28),
    TestResults(1, 7)
]

failed_count = sum(r.failed for r in test_results)
print(failed_count)  # 输出4

因为test_results里的元素都是明确定义的TestResults对象,天然包含failed字段,所以不需要额外的hasattr检查。如果你的列表中可能混入其他没有failed字段的对象,可以加上过滤条件:

failed_count = sum(r.failed for r in test_results if hasattr(r, 'failed'))

方法二:使用operator.attrgetter

如果需要多次提取同一个字段,operator.attrgetter可以让代码更模块化:

from collections import namedtuple
from operator import attrgetter

TestResults = namedtuple('TestResults', ['failed', 'attempted'])

test_results = [
    TestResults(0, 5),
    TestResults(3, 28),
    TestResults(1, 7)
]

get_failed = attrgetter('failed')
failed_count = sum(map(get_failed, test_results))
print(failed_count)  # 输出4

这种方式适合复用字段提取逻辑的场景,单次求和的话,生成器表达式会更直观。

原代码的优化点

原代码里的hasattr检查其实是多余的(如果列表元素都是TestResults),哪怕保留循环,也可以简化成:

failed_count = 0
for r in test_results:
    failed_count += r.failed

但显然前面的两种方法比循环写法更简洁高效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 07:12:38