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
相关产品推荐
相关产品推荐

