杰瑞科技汇

python itertools子集

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

python itertools子集-图1
(图片来源网络,侵删)

方法 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.chaincombinations

通过 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 相同)

python itertools子集-图2
(图片来源网络,侵删)

方法 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)

安装:

python itertools子集-图3
(图片来源网络,侵删)
pip install more_itertools

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

选择适合你的需求的方法即可!

分享:
扫描分享到社交APP
上一篇
下一篇