Python如何实现列表元素可放回抽取N个的所有组合求和?
代码实现
标准库版本(推荐)
直接使用Python内置itertools模块的combinations_with_replacement方法,原生满足「有放回抽取、不计顺序」的组合生成要求:
import itertools def fun(L, N): comb_list = itertools.combinations_with_replacement(L, N) sum_list = [sum(comb) for comb in comb_list] return sum_list
测试验证
L = [1, 2, 4] N = 2 print(fun(L, N)) # 输出:[2, 3, 4, 5, 6],和预期结果完全匹配
无依赖自定义版本
如果不想引入内置库依赖,可以通过递归深度优先搜索自行实现组合生成逻辑:
def fun(L, N): sorted_L = sorted(L) sum_list = [] def dfs(start_idx, current_comb): if len(current_comb) == N: sum_list.append(sum(current_comb)) return for i in range(start_idx, len(sorted_L)): dfs(i, current_comb + [sorted_L[i]]) dfs(0, []) return sum_list
实现逻辑说明:先对输入列表排序,每次选取元素仅从当前下标及之后的位置取,避免生成[2,1]这类和[1,2]元素重复的组合,凑够N个元素就直接求和存入结果。
内容的提问来源于stack exchange,提问作者Physics
相关产品推荐
相关产品推荐

