【Python|标准库】标准库之itertools
itertools 是 Python 的一个标准库模块,提供了用于操作迭代器的函数,能够高效地处理循环和组合数据。这个模块的函数可以帮助你生成各种复杂的迭代模式,如排列、组合、笛卡尔积等,且大多数操作都是懒加载的,即在需要时才生成结果,这使得它们在处理大型数据集时特别高效。
——————————————————————-
itertools.combinations(iterable, r) 是一个用于生成 组合 的工具函数。组合是一种从集合中选取元素的方法,不考虑元素的排列顺序,因此不会有重复的元素。
函数定义
itertools.combinations(iterable, r)
iterable:输入的可迭代对象,例如列表、字符串或其他可迭代对象。r:从iterable中选取的元素数量。
返回值是一个 迭代器,其中每个元素是一个包含 r 个项目的元组。
特点
- 无重复:生成的组合不包含重复项。
- 顺序无关:即
(1, 2)和(2, 1)被视为同一个组合,结果中只会包含(1, 2)。 - 懒加载:只在需要时生成组合,适合大数据集。
用法示例
1. 从列表中生成组合
import itertools
data = [1, 2, 3, 4]
result = itertools.combinations(data, 2)
for combo in result:
print(combo)
输出:
(1, 2)
(1, 3)
(1, 4)
(2, 3)
(2, 4)
(3, 4)
解释:
- 取长度为 2 的组合,共有 6 种可能。
2. 从字符串中生成组合
import itertools
data = "ABC"
result = itertools.combinations(data, 2)
print(list(result))
输出:
[('A', 'B'), ('A', 'C'), ('B', 'C')]
解释:
- 取长度为 2 的组合,共有 3 种可能。
3. 较大的组合数
import itertools
data = range(5) # [0, 1, 2, 3, 4]
result = itertools.combinations(data, 3)
for combo in result:
print(combo)
输出:
(0, 1, 2)
(0, 1, 3)
(0, 1, 4)
(0, 2, 3)
(0, 2, 4)
(0, 3, 4)
(1, 2, 3)
(1, 2, 4)
(1, 3, 4)
(2, 3, 4)
解释:
- 从
[0, 1, 2, 3, 4]中取长度为 3 的组合,共有 10 种可能。
数学公式
组合的总数由公式计算:
[
C(n, r) = \frac{n!}{r! \cdot (n – r)!}
]
n是iterable的长度。r是选取的元素个数。
例如,上例中从长度为 5 的集合中取 3 个元素:
[
C(5, 3) = \frac{5!}{3! \cdot (5-3)!} = 10
]
注意事项
- 如果
r的值大于iterable的长度,则返回空迭代器。
result = itertools.combinations([1, 2, 3], 4)
print(list(result)) # 输出:[]
- 如果
r为 0,则返回一个空元组,表示从集合中选取零个元素:
result = itertools.combinations([1, 2, 3], 0)
print(list(result)) # 输出:[()]
与排列的区别
- 组合(
combinations):顺序无关,不包含重复。例如,(1, 2)和(2, 1)是同一个组合。 - 排列(
permutations):顺序有关,每种排列都会单独计算。例如,(1, 2)和(2, 1)是两个不同的排列。
总结
itertools.combinations 是生成组合的强大工具,适用于:
- 解决数学中的组合问题。
- 筛选数据的特定子集。
- 生成各种可能的元素组,适用于概率、统计、机器学习中的特征组合等场景。