说明
《Python 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
itertools.combinations_with_replacement() 是 Python itertools 模块中的一个函数,用于生成给定可迭代对象的所有可能组合,其中每个组合允许包含相同元素的重复。itertools.combinations_with_replacement() 生成一个迭代器,其中包含给定长度 r 的所有可能组合。与 itertools.combinations() 不同,这个函数允许同一个元素在同一个组合中出现多次。
语法为 itertools.combinations_with_replacement(iterable, r)
返回由输入 iterable 中元素组成的长度为 r 的子序列,允许每个元素可重复出现。组合元组会以字典顺序根据所输入 iterable 的顺序发出。 因此,如果所输入 iterable 是已排序的,组合元组也将按已排序的顺序生成。不同位置的元素是不同的,即使它们的值相同。因此如果输入中的元素都是不同的话,返回的组合中元素也都会不同。
参数与返回:
注意事项:
大致相当于:
def combinations_with_replacement(iterable, r):
# combinations_with_replacement('ABC', 2) --> AA AB AC BB BC CC
pool = tuple(iterable)
n = len(pool)
if not n and r:
return
indices = [0] * r
yield tuple(pool[i] for i in indices)
while True:
for i in reversed(range(r)):
if indices[i] != n - 1:
break
else:
return
indices[i:] = [indices[i] + 1] * (r - i)
yield tuple(pool[i] for i in indices)
combinations_with_replacement() 的代码可被改写为 production() 过滤后的子序列,(相对于元素在输入中的位置)元素不是有序的。
def combinations_with_replacement(iterable, r):
pool = tuple(iterable)
n = len(pool)
for indices in product(range(n), repeat=r):
if sorted(indices) == list(indices):
yield tuple(pool[i] for i in indices)
当 n > 0
时,返回项个数为 (n+r-1)! / r! / (n-1)!
。
例如:
import itertools
it1 = itertools.combinations_with_replacement([1,2,3], r=2)
[*it1]
# [(1, 1), (1, 2), (1, 3), (2, 2), (2, 3), (3, 3)]
it2 = itertools.combinations_with_replacement([1,2,3], r=3)
[*it2]
'''
[(1, 1, 1),
(1, 1, 2),
(1, 1, 3),
(1, 2, 2),
(1, 2, 3),
(1, 3, 3),
(2, 2, 2),
(2, 2, 3),
(2, 3, 3),
(3, 3, 3)]
'''
import itertools
data = [1, 2, 3]
# 使用 combinations_with_replacement 生成长度为2的组合
result = itertools.combinations_with_replacement(data, 2)
print(list(result))
# 输出 [(1, 1), (1, 2), (1, 3), (2, 2), (2, 3), (3, 3)]
import itertools
data = 'AB'
# 使用 combinations_with_replacement 生成长度为2的组合
result = itertools.combinations_with_replacement(data, 2)
print(list(result))
# 输出 [('A', 'A'), ('A', 'B'), ('B', 'B')]
假设我们有一个字符列表,我们希望生成该列表的所有可能组合,其中允许字符重复。
示例数据:
chars = ['a', 'b']
目标生成所有可能的字符组合,长度为2:
[('a', 'a'), ('a', 'b'), ('b', 'b')]
实现代码:
import itertools
chars = ['a', 'b']
# 使用 itertools.combinations_with_replacement 生成字符组合
result = itertools.combinations_with_replacement(chars, 2)
print(list(result)) # 输出 [('a', 'a'), ('a', 'b'), ('b', 'b')]
解释:
itertools.combinations_with_replacement(chars, 2)
生成字符列表 chars 的所有可能组合,组合长度为2,允许重复元素。输出结果:
[('a', 'a'), ('a', 'b'), ('b', 'b')]
这个实用案例展示了如何使用 itertools.combinations_with_replacement()
生成一个可迭代对象的所有可能组合,包括重复元素,非常适用于排列生成、概率与统计分析和密码分析的场景。
更新时间:2024-07-04 08:57:08 标签:python 组合 替换组合 itertools