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

如何高效生成含重复元素的Python唯一排列?

高效生成含x个a和z个b的唯一排列方法

你当前用itertools.permutations()加去重的方式效率极低,核心原因是全排列的数量是(x+z)!,而实际唯一排列的数量仅为组合数C(x+z, x),两者差距巨大(比如16个元素、7个a9个b的场景,全排列约2e13个,唯一排列仅11440个),去重过程完全是做无用功。

高效实现思路

直接通过选择a的放置位置来生成唯一排列:从总长度x+z的位置中选出x个位置放a,剩下的位置自动放b,全程不会产生重复排列。

代码实现

import itertools

def unique_ab_permutations(count_a, count_b, elem_a='item a', elem_b='item b'):
    total_length = count_a + count_b
    # 遍历所有放置elem_a的位置组合
    for a_positions in itertools.combinations(range(total_length), count_a):
        permutation = [elem_b] * total_length
        for pos in a_positions:
            permutation[pos] = elem_a
        yield tuple(permutation)  # 若需要列表形式,直接返回permutation即可

为什么这个方法高效

  • 时间复杂度直接对应唯一排列的数量,即组合数C(x+z, x),无需额外去重操作
  • 内存占用低,无需存储已生成的排列做查重对比
  • 对于你提到的16元素场景,仅需生成11440个排列,执行速度会有质的提升

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 10:05:14