在 Python 中,可以使用 itertools 模块来高效地生成一个集合的所有子集(幂集),以下是几种实现方式:

方法 1:使用 itertools.combinations
itertools.combinations 用于生成指定长度的所有组合,通过遍历所有可能的长度(从 0 到 n),可以获取所有子集。
from itertools import combinations
def subsets(iterable):
s = list(iterable)
for i in range(len(s) + 1):
for combo in combinations(s, i):
yield combo
# 示例
my_set = [1, 2, 3]
for subset in subsets(my_set):
print(subset)
输出:
()
(1,)
(2,)
(3,)
(1, 2)
(1, 3)
(2, 3)
(1, 2, 3)
方法 2:使用 itertools.chain 和 combinations
通过 itertools.chain 将不同长度的组合结果连接起来,生成一个扁平化的迭代器。
from itertools import chain, combinations
def subsets(iterable):
s = list(iterable)
return chain.from_iterable(combinations(s, r) for r in range(len(s) + 1))
# 示例
my_set = [1, 2, 3]
for subset in subsets(my_set):
print(subset)
输出:(与方法 1 相同)

方法 3:使用位运算(非 itertools,但高效)
如果输入集合较小(如长度 ≤ 32),可以通过位运算直接生成所有子集:
def subsets_bitwise(s):
n = len(s)
for i in range(1 << n): # 2^n 种可能
yield tuple(s[j] for j in range(n) if (i >> j) & 1)
# 示例
my_set = [1, 2, 3]
for subset in subsets_bitwise(my_set):
print(subset)
输出:(与方法 1 相同)
方法 4:使用 more_itertools(第三方库)
如果已安装 more_itertools,可以直接使用 more_itertools.powerset:
from more_itertools import powerset
my_set = [1, 2, 3]
for subset in powerset(my_set):
print(subset)
安装:

pip install more_itertools
| 方法 | 适用场景 | 特点 |
|---|---|---|
itertools.combinations |
标准库,需要手动遍历长度 | 直观,但需嵌套循环 |
chain.from_iterable |
标准库,更简洁 | 避免嵌套循环 |
| 位运算 | 小集合(≤32 元素) | 极快,但依赖整数位宽 |
more_itertools.powerset |
第三方库 | 最简洁,需安装依赖 |
选择适合你的需求的方法即可!
