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

如何根据指定长度将列表生成不重复排序子列表集合?

生成指定长度的不重复子列表(支持子列表内部排序)

当然有超简洁的实现方式!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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:36:18