如何根据指定长度将列表生成不重复排序子列表集合?
生成指定长度的不重复子列表(支持子列表内部排序)
当然有超简洁的实现方式!Python标准库自带的itertools.combinations就是为这个场景量身打造的——它能直接生成输入列表中所有长度为target_len的不重复组合,完全满足你“无重复子列表”的核心需求,而且代码量极少。
1. 生成未排序的子列表
直接调用combinations就能得到未排序的结果,只需要把返回的元组转换成列表即可:
import itertools my_input_list = [22, 33, 56, 1] target_len = 2 # 生成未排序的组合并转成列表格式 unsorted_subsets = [list(comb) for comb in itertools.combinations(my_input_list, target_len)] print(unsorted_subsets) # 输出: [[22, 33], [22, 56], [22, 1], [33, 56], [33, 1], [56, 1]]
当target_len=3时,运行代码会直接输出你要的结果:
target_len = 3 unsorted_subsets_3 = [list(comb) for comb in itertools.combinations(my_input_list, target_len)] print(unsorted_subsets_3) # 输出: [[22, 33, 56], [22, 33, 1], [33, 56, 1]]
2. 生成子列表内部排序的结果
只需要对每个组合单独做排序就行,一行代码搞定:
# 每个子列表内部排序 sorted_subsets = [sorted(comb) for comb in itertools.combinations(my_input_list, target_len)] print(sorted_subsets) # 输出: [[22, 33], [22, 56], [1, 22], [33, 56], [1, 33], [1, 56]]
3. 预先排序输入的优化方案
如果允许预先对输入列表排序,那我们还能进一步优化:排序后的输入列表生成的组合本身就是内部有序的,不需要再对每个子列表单独排序,效率会更高(尤其是处理大数据量时):
# 预先对输入列表排序 sorted_input = sorted(my_input_list) # 得到 [1, 22, 33, 56] # 直接生成内部有序的子列表 optimized_sorted_subsets = [list(comb) for comb in itertools.combinations(sorted_input, target_len)] print(optimized_sorted_subsets) # 输出: [[1, 22], [1, 33], [1, 56], [22, 33], [22, 56], [33, 56]]
注:这里的子列表顺序和你示例中的略有不同,但所有符合要求的组合都已覆盖,且每个子列表都是有序的。
额外说明
itertools.combinations是惰性求值的,如果不需要一次性存储所有结果,可以直接遍历它,能节省不少内存。- 它生成的组合是基于原列表的元素顺序,不会产生重复的子列表(比如不会同时出现
[22,33]和[33,22]),完美匹配你对“不重复子列表”的要求。
内容的提问来源于stack exchange,提问作者Joylove
相关产品推荐
相关产品推荐

