Python itertools模块的combinations函数介绍
itertools
模块是 Python 标准库中一个非常强大的工具,提供了很多用于高效迭代的函数。其中,itertools.combinations
是一个常用函数,用于从输入的可迭代对象中生成不重复的组合。
函数签名
itertools.combinations(iterable, r)
参数说明
-
iterable
:要组合的可迭代对象,如列表、字符串等。 -
r
:每个组合中元素的个数。
作用:
返回 iterable
中元素长度为 r
的所有 不重复组合(即不考虑顺序)。
返回值:
返回一个迭代器,生成所有长度为 r
的组合,每个组合是一个元组。
示例代码1:
import itertools
data = ['A', 'B', 'C']
combs = itertools.combinations(data, 2)
for c in combs:
print(c)
输出:
('A', 'B')
('A', 'C')
('B', 'C')
这些是从 ['A', 'B', 'C']
中选出 2 个元素的所有组合(顺序不重要)。
注意事项:
-
输出是按字典序排列的(以
iterable
中元素顺序为基础)。 -
不会有重复组合,例如不会出现
('B', 'A')
,因为('A', 'B')
已经代表这个组合。 -
如果
r > len(iterable)
,返回的是一个空的迭代器。
示例代码2:
从数字中组合出所有可能的 3 个数:
from itertools import combinations
nums = [1, 2, 3, 4]
print(list(combinations(nums, 3)))
输出:
[(1, 2, 3), (1, 2, 4), (1, 3, 4), (2, 3, 4)]
和permutations函数的区别
itertools.permutations
是 itertools
模块中另一个非常常用的函数,用于生成 排列(和组合不一样,排列是有顺序的)。
函数签名
itertools.permutations(iterable, r=None)
参数说明:
-
iterable
:要排列的可迭代对象,如列表、字符串等。 -
r
(可选):排列的长度,默认是len(iterable)
(即全排列)。
作用:
返回 iterable
中元素长度为 r
的所有 有序排列(考虑顺序)。
返回值:
返回一个迭代器,生成所有长度为 r
的排列,每个排列是一个元组。
示例代码:
import itertools
data = ['A', 'B', 'C']
perms = itertools.permutations(data, 2)
for p in perms:
print(p)
输出:
('A', 'B')
('A', 'C')
('B', 'A')
('B', 'C')
('C', 'A')
('C', 'B')
-
注:和
combinations
不同,permutations
考虑顺序,所以('A', 'B')
和('B', 'A')
是不同的排列。 -
不会有重复元素(除非输入中有重复元素)。
-
如果
r
没有指定,则生成的是全排列。
combinations
vs permutations
对比:
函数 | 是否考虑顺序 | 是否允许重复元素 | 返回数量(从 n 中取 r) |
---|---|---|---|
combinations | 否 | 否 | C(n, r) = n! / (r!(n-r)!) |
permutations | 是 | 否 | P(n, r) = n! / (n - r)! |