Python如何不使用sum()函数计算列表所有非空子集的元素和
实现代码(按要求的组合长度顺序计算,不使用sum())
from itertools import combinations # 示例输入列表 my_list = [1, 2, 3, 4, 5, 6] total = 0 list_len = len(my_list) # 从二元组合开始遍历,直到等于列表长度的组合 for k in range(2, list_len + 1): # 生成所有长度为k的不重复元素组合 for current_combo in combinations(my_list, k): # 手动累加计算当前组合的和,不调用内置sum() combo_sum = 0 for num in current_combo: combo_sum += num total += combo_sum print("所有符合要求的子集和总和为", total)
代码说明
- 遍历逻辑完全符合要求的计算顺序:先算所有二元组和,再依次算三元、四元直到列表长度的组合和
- 组合生成使用标准库
itertools.combinations,保证不会生成重复的元素组合 - 目前未纳入单元素子集计算,如果需要包含单元素,只需将
range(2, list_len + 1)修改为range(1, list_len + 1)即可
优化方案(适合长列表,避免组合爆炸)
如果你的列表长度较大,枚举所有组合会导致性能急剧下降,可以直接用数学推导计算结果:
每个元素在所有长度≥2的子集中的出现次数为 2^(列表长度-1) - 1,因此总总和 = 所有元素累加值 * (2^(列表长度-1) - 1)
以示例列表计算:
列表元素和为 1+2+3+4+5+6 = 21,列表长度为6,因此总总和 = 21 * (2^5 -1) = 21 * 31 = 651,和暴力枚举结果完全一致。
内容的提问来源于stack exchange,提问作者Karafakeu
相关产品推荐
相关产品推荐

