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
相关产品推荐
相关产品推荐

