Python实现从短列表生成指定长度的可重复排列组合
解决方案:生成指定长度的可重复有序组合
你要的其实是输入列表与自身进行n次笛卡尔积(n为指定长度),Python标准库中的itertools.product是最高效的实现方式,完全能解决超时问题——因为它是基于C底层实现的,比纯Python递归/循环快几个数量级。
直接使用itertools.product
代码示例:
import itertools def generate_repeatable_permutations(input_list, length): # product返回元组迭代器,转成列表即可 return [list(item) for item in itertools.product(input_list, repeat=length)] # 测试示例 input_list = [1, 2] target_length = 3 result = generate_repeatable_permutations(input_list, target_length) print(result)
输出结果完全符合你的期望:[[1, 1, 1], [1, 1, 2], [1, 2, 1], [1, 2, 2], [2, 1, 1], [2, 1, 2], [2, 2, 1], [2, 2, 2]]
为什么之前的方法会超时?
如果你之前用的是纯Python实现的递归、嵌套循环或者手动拼接组合,这类方法在列表元素多、目标长度大时,会因为Python解释器的额外开销导致速度急剧下降。而itertools.product直接调用C级别的循环,避免了这些冗余操作,性能提升非常明显。
手动实现(仅作参考,不推荐用于性能敏感场景)
如果因为某些限制不能使用itertools,可以用递归优化实现,但效率远不如标准库:
def generate_repeatable_permutations(input_list, length): if length == 0: return [[]] prev_result = generate_repeatable_permutations(input_list, length - 1) return [item + [num] for item in prev_result for num in input_list] # 测试 input_list = [1,2] print(generate_repeatable_permutations(input_list, 3))
内容的提问来源于stack exchange,提问作者Sherif Emad
相关产品推荐
相关产品推荐

