Python:itertools模块 combinations、permutations和product的使用

Python:itertools模块 combinations、permutations和product的使用,第1张

概述Python学习笔记combinationspermutationsproductcombinationscombinations(iterable, r) 创建一个迭代器,返回iterable中所有长度为r的子序列,返回的子序列中的项按输入iterable中的顺序排序:解释:itertools.combinations(iterable, r)返回由输入 iterable 中元素组成长度为 r 的子序列。组合元组会以字典顺序根据所输入 iterable 的顺序发出。 因此,如果所输入 ite

Python学习笔记 combinationspermutationsproduct

combinations

combinations(iterable,r) 创建一个迭代器,返回iterable中所有长度为r的子序列,返回的子序列中的项按输入iterable中的顺序排序:

解释:
itertools.combinations(iterable,r)
返回由输入 iterable 中元素组成长度为 r 的子序列。
组合元组会以字典顺序根据所输入 iterable 的顺序发出。 因此,如果所输入 iterable 是已排序的,组合元组也将按已排序的顺序生成。
即使元素的值相同,不同位置的元素也被认为是不同的。如果元素各自不同,那么每个组合中没有重复元素。
相当于排列组合枚举所有情况

源码:

def combinations(iterable, r):    # combinations('ABCD',2) --> AB AC AD BC BD CD    # combinations(range(4),3) --> 012 013 023 123    pool = tuple(iterable)    n = len(pool)    if r > n:        return    indices = 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:                break        else:            return        indices[i] += 1        for j in range(i+1, r):            indices[j] = indices[j-1] + 1        yIEld tuple(pool[i] for i in indices)

注意:combinations() 的代码可被改写为 permutations() 过滤后的子序列,(相对于元素在输入中的位置)元素不是有序的。

def combinations(iterable, r):    pool = tuple(iterable)    n = len(pool)    for indices in permutations(range(n), r):        if sorted(indices) == List(indices):            yIEld tuple(pool[i] for i in indices)
permutations

解释:
连续返回由 iterable 元素生成长度为 r 的排列。

如果 r 未指定或为 None ,r 默认设置为 iterable 的长度,这种情况下,生成所有全长排列。

排列元组会以字典顺序根据所输入 iterable 的顺序发出。 因此,如果所输入 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 210    pool = tuple(iterable)    n = len(pool)    r = n if r is None else r    if r > n:        return    indices = 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] -= 1            if cycles[i] == 0:                indices[i:] = indices[i+1:] + indices[i:i+1]                cycles[i] = n - i            else:                j = cycles[i]                indices[i], indices[-j] = indices[-j], indices[i]                yIEld tuple(pool[i] for i in indices[:r])                break        else:            return

注意:permutations() 的代码也可被改写为 product() 的子序列,只要将含有重复元素(来自输入中同一位置的)的项排除。

def permutations(iterable, r=None):    pool = tuple(iterable)    n = len(pool)    r = n if r is None else r    for indices in product(range(n), repeat=r):        if len(set(indices)) == r:            yIEld tuple(pool[i] for i in indices)
product

解释:
可迭代对象输入的笛卡儿积。

大致相当于生成器表达式中的嵌套循环。例如, product(A,B) 和 ((x,y) for x in A for y in B) 返回结果一样。

嵌套循环像里程表那样循环变动,每次迭代时将最右侧的元素向后迭代。这种模式形成了一种字典序,因此如果输入的可迭代对象是已排序的,笛卡尔积元组依次序发出。

要计算可迭代对象自身的笛卡尔积,将可选参数 repeat 设定为要重复的次数。例如,product(A,repeat=4) 和 product(A,A,A) 是一样的。

该函数大致相当于下面的代码,只不过实际实现方案不会在内存中创建中间结果。

def product(*args, repeat=1):    # product('ABCD','xy') --> Ax Ay Bx By Cx Cy Dx Dy    # product(range(2),repeat=3) --> 000 001 010 011 100 101 110 111    pools = [tuple(pool) for pool in args] * repeat    result = [[]]    for pool in pools:        result = [x+[y] for x in result for y in pool]    for prod in result:        yIEld tuple(prod)

参考文献:
官方api文档

总结

以上是内存溢出为你收集整理的Python:itertools模块 combinations、permutations和product的使用全部内容,希望文章能够帮你解决Python:itertools模块 combinations、permutations和product的使用所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1189239.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存