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

如何高效生成combinations_with_replacement结果中各组合的无重复排列?

嘿,这个问题我太熟悉了!直接用itertools.permutations处理带重复元素的组合时,确实会生成大量冗余的重复排列,既浪费计算资源又拖慢速度。这里有几个实用的解决方案,帮你高效生成每个组合的唯一排列:

方法1:用第三方库生成多重集合排列(最省心高效)

如果可以安装额外的库,more_itertools里的distinct_permutations专门针对这类场景设计,它会直接生成无重复的排列,不需要事后去重,效率拉满:

import itertools as it
from more_itertools import distinct_permutations

N = 14
SIZE = 6
lst = range(N+1)
sum_n_combs = [list(comb) for comb in it.combinations_with_replacement(lst, SIZE) if sum(comb) == N]

# 生成所有唯一排列
unique_permutations = []
for combo in sum_n_combs:
    unique_permutations.extend(distinct_permutations(combo))

# 如果你需要把结果转成列表格式(和原输出一致)
unique_permutations = [list(perm) for perm in unique_permutations]

方法2:SymPy库的多重集合排列(另一个第三方选项)

如果你已经在用SymPy做数学相关开发,它的multiset_permutations函数也能完美解决这个问题:

import itertools as it
from sympy.utilities.iterables import multiset_permutations

N = 14
SIZE = 6
lst = range(N+1)
sum_n_combs = [list(comb) for comb in it.combinations_with_replacement(lst, SIZE) if sum(comb) == N]

unique_permutations = []
for combo in sum_n_combs:
    unique_permutations.extend(multiset_permutations(combo))

方法3:纯标准库实现(无需额外安装)

如果不想引入第三方依赖,我们可以利用set的去重特性来处理,虽然效率略低于第三方库,但对于你的问题规模(sum_n_combs只有90个组合)完全够用:

import itertools as it

N = 14
SIZE = 6
lst = range(N+1)
sum_n_combs = [list(comb) for comb in it.combinations_with_replacement(lst, SIZE) if sum(comb) == N]

unique_permutations = []
for combo in sum_n_combs:
    # 生成所有排列后转成元组(列表不可哈希),用集合去重,再转回列表
    perm_set = set(it.permutations(combo))
    unique_permutations.extend(list(perm) for perm in perm_set)

小提示

如果你追求极致的标准库效率,可以自己通过统计元素出现频率来生成唯一排列(比如利用递归或组合数学计算唯一排列的数量),但上面的方法已经能满足绝大多数场景的需求啦。

内容的提问来源于stack exchange,提问作者Jingu Lee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 13:02:46