chan

朝生暮死不足笑 但悲百年不足道

【Python|标准库】标准库之itertools


itertools 是 Python 的一个标准库模块,提供了用于操作迭代器的函数,能够高效地处理循环和组合数据。这个模块的函数可以帮助你生成各种复杂的迭代模式,如排列、组合、笛卡尔积等,且大多数操作都是懒加载的,即在需要时才生成结果,这使得它们在处理大型数据集时特别高效。

——————————————————————-

itertools.combinations(iterable, r) 是一个用于生成 组合 的工具函数。组合是一种从集合中选取元素的方法,不考虑元素的排列顺序,因此不会有重复的元素。


函数定义

itertools.combinations(iterable, r)
  • iterable:输入的可迭代对象,例如列表、字符串或其他可迭代对象。
  • r:从 iterable 中选取的元素数量。

返回值是一个 迭代器,其中每个元素是一个包含 r 个项目的元组。


特点

  1. 无重复:生成的组合不包含重复项。
  2. 顺序无关:即 (1, 2)(2, 1) 被视为同一个组合,结果中只会包含 (1, 2)
  3. 懒加载:只在需要时生成组合,适合大数据集。

用法示例

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)!}
]

  • niterable 的长度。
  • r 是选取的元素个数。

例如,上例中从长度为 5 的集合中取 3 个元素:
[
C(5, 3) = \frac{5!}{3! \cdot (5-3)!} = 10
]


注意事项

  1. 如果 r 的值大于 iterable 的长度,则返回空迭代器。
   result = itertools.combinations([1, 2, 3], 4)
   print(list(result))  # 输出:[]
  1. 如果 r 为 0,则返回一个空元组,表示从集合中选取零个元素:
   result = itertools.combinations([1, 2, 3], 0)
   print(list(result))  # 输出:[()]

与排列的区别

  • 组合(combinations):顺序无关,不包含重复。例如,(1, 2)(2, 1) 是同一个组合。
  • 排列(permutations):顺序有关,每种排列都会单独计算。例如,(1, 2)(2, 1) 是两个不同的排列。

总结

itertools.combinations 是生成组合的强大工具,适用于:

  • 解决数学中的组合问题。
  • 筛选数据的特定子集。
  • 生成各种可能的元素组,适用于概率、统计、机器学习中的特征组合等场景。
评论
还没有评论
    发表评论 说点什么