下列模块函数均创建并返回迭代器。
排列组合迭代器
迭代器 | 实参 | 结果 |
|---|---|---|
| p[, r] | 长度r元组,所有可能的排列,无重复元素 |
| p, r | 长度r元组,有序,无重复元素 |
| p, r | 长度r元组,有序,元素可重复 |
例子 | 结果 |
|---|---|
|
|
|
|
|
|
itertools.combinations(iterable,r)itertools.combinations(iterable, r)itertools.combinations(iterable,r)
返回由输入 iterable 中元素组成长度为 r 的子序列。
源码
def combinations(iterable, r):# combinations('ABCD', 2) --> AB AC AD BC BD CD# combinations(range(4), 3) --> 012 013 023 123pool = tuple(iterable)n = len(pool)if r > n: #如果长度大于可迭代对象的长度,退出函数returnindices = list(range(r))yield tuple(pool[i] for i in indices)while True:for i in reversed(range(r)):if indices[i] != i + n - r:breakelse:returnindices[i] += 1for j in range(i+1, r):indices[j] = indices[j-1] + 1yield tuple(pool[i] for i in indices)
itertools.combinationswithreplacement(iterable,r)itertools.combinations_with_replacement(iterable, r)itertools.combinationswithreplacement(iterable,r)
返回由输入 iterable 中元素组成的长度为 r 的子序列,允许每个元素可重复出现。
源码
def combinations_with_replacement(iterable, r):# combinations_with_replacement('ABC', 2) --> AA AB AC BB BC CCpool = tuple(iterable)n = len(pool)if not n and r:returnindices = [0] * ryield tuple(pool[i] for i in indices)while True:for i in reversed(range(r)):if indices[i] != n - 1:breakelse:returnindices[i:] = [indices[i] + 1] * (r - i)yield tuple(pool[i] for i in indices)
itertools.permutations(iterable,r=None)itertools.permutations(iterable, r=None)itertools.permutations(iterable,r=None)
连续返回由 iterable 元素生成长度为 r 的排列。
如果 r 未指定或为 None ,r 默认设置为 iterable 的长度,这种情况下,生成所有全长排列。
源码
def permutations(iterable, r=None):# permutations('ABCD', 2) --> AB AC AD BA BC BD CA CB CD DA DB DC# permutations(range(3)) --> 012 021 102 120 201 210pool = tuple(iterable)n = len(pool)r = n if r is None else rif r > n:returnindices = list(range(n))cycles = list(range(n, n-r, -1))yield tuple(pool[i] for i in indices[:r])while n:for i in reversed(range(r)):cycles[i] -= 1if cycles[i] == 0:indices[i:] = indices[i+1:] + indices[i:i+1]cycles[i] = n - ielse:j = cycles[i]indices[i], indices[-j] = indices[-j], indices[i]yield tuple(pool[i] for i in indices[:r])breakelse:return
值得一提的是,无论是排列函数还是组合函数都无法对可迭代对象具体的值是否相同进行识别,如果需要最终序列中不出现相同的形式,则需要对序列去重(使用set不失为一种好方法)。
上一篇:差价十几倍,从二手书到衣服,多抓鱼还能收割文艺青年多久 差价十几倍,从二手书到衣服,多抓鱼还能收割文艺青年多久
下一篇:去年净利润由盈转亏,“老将”回归后,这家台州老牌药企能否重新起航?|财报异动透视镜 去年净利润由盈转亏,“老将”回归后,这家台州老牌药企能否重新起航?|财报异动透视镜