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

Python中如何获取列表的所有无序非空组合?

当然可以实现!

你要的其实是列表的所有非空无序组合(也就是所有非空子集,因为子集不考虑元素顺序,且不会出现重复的排列),Python的标准库itertools正好提供了完美的解决方案,完全符合你不想出现[1,2]和[2,1]这类重复项的要求。

具体实现思路

itertools.combinations(iterable, r)函数可以生成输入可迭代对象中所有长度为r的无序组合,而且不会产生重复的排列结果。我们只需要遍历从1到原列表长度的所有可能组合长度,把每个长度对应的组合收集起来就行。

代码示例

import itertools

# 你的原始列表
original_list = [1, 2, 3]
# 初始化结果列表
all_combinations = []

# 遍历从1到列表长度的所有组合长度
for combo_length in range(1, len(original_list) + 1):
    # 生成当前长度的所有组合,转成列表后加入结果
    current_combos = list(itertools.combinations(original_list, combo_length))
    # 把每个元组转成列表(因为combinations返回的是元组)
    all_combinations.extend([list(combo) for combo in current_combos])

print(all_combinations)

运行这段代码后,输出结果就是:

[[1], [2], [3], [1, 2], [1, 3], [2, 3], [1, 2, 3]]

更简洁的写法(列表推导式)

如果喜欢更紧凑的代码,可以用嵌套列表推导式一步完成:

import itertools

original_list = [1, 2, 3]
all_combinations = [list(combo) for length in range(1, len(original_list)+1) 
                    for combo in itertools.combinations(original_list, length)]

print(all_combinations)

补充说明

  • itertools.combinations生成的组合是无序且不重复的,所以完全不会出现你担心的[1,2]和[2,1]这类情况;
  • 如果需要包含空集([]),只需要把range(1, ...)改成range(0, ...)即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 15:02:51