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

Python如何获取含重复元素列表的所有唯一有序排列组合

仅含1、2的列表生成唯一排列的实现方案

你使用itertools.product出现重复且效率低的核心原因是,该函数的作用是生成笛卡尔积,本身不适用于排列计算场景,针对你的需求有两种基于标准库的实现方式:

方案1:通用去重排列实现

适用于所有存在重复元素的列表求唯一排列的场景,基于itertools.permutations配合集合去重实现:

from itertools import permutations

# 输入列表
input_lst = [2, 1, 1, 1]
# 生成全排列后转集合去重,再转成列表格式
unique_perms = [list(p) for p in set(permutations(input_lst))]

缺点:当列表长度较大、重复元素占比高时,先生成全排列再去重会产生大量冗余计算,性能较差。

方案2:仅含1、2场景下的最优实现

因为你的列表只有1和2两种元素,唯一排列的本质是选择指定数量的位置放置2,其余位置放1,用itertools.combinations实现,无任何冗余计算,效率最高:

from itertools import combinations

# 输入列表
input_lst = [2, 1, 1, 1]
n = len(input_lst)
count_2 = input_lst.count(2)

unique_perms = []
# 从n个位置中选count_2个位置放2
for positions in combinations(range(n), count_2):
    perm = [1] * n
    for pos in positions:
        perm[pos] = 2
    unique_perms.append(perm)

该方案的时间复杂度仅和组合数C(n,k)正相关(n为列表总长度,k为列表中2的个数),不会产生任何重复结果,即使列表规模很大也能快速运行。

补充说明:Python标准库没有提供直接生成重复元素唯一排列的单步内置函数,上述两种方案都是基于标准库itertools模块的常规实现。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 10:09:01