python中itertools的permutation,Python itertool
Python itertools.combinations和itertools。置换等价代码实现_wx62830f4b679a4的技术博客_博客
最近编程时经常要用到排序组合的代码,想当年还抱着一些情况买了一本《组合数学》 ,不过现在这货也不知道被自己放哪里了,估计不会是垫桌子腿了吧。
由于去年去东北大学考博面试的时候遇到过可能涉及排列组合的编程题,要我当时很是十分的下不来台,所以现在遇到这货比较敏感,虽然用到的时候直接调用库就万事大吉,不过细细想来总觉不妥,遂把库函数的说明文档调了出来。
https://份文件。python。组织/开发/图书馆/ITER工具。ITER工具。组合
itertools .组合(iterable,r)
从输入可迭代的返回r长度的元素子序列。
组合是按字典排序顺序发出的。因此,如果输入可迭代的是排序的,组合元组将按排序的顺序产生。
元素被视为唯一是基于它们的位置,而不是它们的值。因此,如果输入元素是唯一的,则每个组合中不会有重复的值。
大致相当于:
定义组合(iterable,r):
#组合( ABCD ,2) - AB AC AD BC BD CD
#组合(范围(4),3) - 012 013 023 123
pool=tuple(可迭代)
n=len(池)
如果注册号码:
返回
indexes=list(range(r))
产出元组(索引中我的池[我])
虽然正确:
对于反向的我(范围(r)):
if indexes[I]!=i n - r:
破裂
否则:
返回
指数[i]=1
对于范围(一^ 1,r)中的j:
索引[j]=索引[j-1] 1
产出元组(索引中我的池[我])
初看这个代码感觉比较震惊,感觉这是什么鬼,代码量不是很大,不过实现的功能倒是要人感觉很强大。
以上代码虽然是等价代码,但是毕竟为源语言实现的,由此看看还是有些帮助的,估计真实库文件可能是使用C语言写的吧,这一点就不深入研究了。
pool=tuple(可迭代)该行代码则是将输入的可迭代对象转换为元组类型。
n=len(池)
如果注册号码:
返回该段代码则是得到元组长度n,如果排序数r大于总长n,则无意义,因此直接返回。
索引=列表(范围(r))索引为排序的索引,也是每次迭代返回组合的索引号。
产出元组(索引中我的池[我])返回默认的组合。如:池为(0,1,2,3,4),n=5,r=3,默认的返回就是(0,1,2) 。
对于反向的我(范围(r)):
if indexes[I]!=i n - r:
破裂判断返回的组合序号是否为终止的序号,即(2,3,4)。
指数[i]=1返回的序号中如果那个位置的序号不等于终止序列中的对应该位置的序号则将该位置序号加一。
(0,1,2)=》 (0,1,3)
(0,1,3)=》 (0,1,4)
(0,1,4)="(0,2,4)对于范围(一^ 1,r)中的j:
索引[j]=索引[j-1] 1不同的序号位置加一后,其后续的位置依次在其前一位置上加一。
即,(0,2,4)=》(0,2,3), (0,3,4)=》(1,3,4)=》(1,2,4)=》(1,2,3)
=============================================
https://份文件。python。组织/开发/图书馆/ITER工具。ITER工具。排列
itertools .排列(可重复,r=无)
返回可迭代的中元素的连续r长度排列。
如果没有指定r或者r为没有,那么r默认为可迭代的的长度,并且生成所有可能的全长置换。
排列是按字典排序顺序发出的。因此,如果输入可迭代的被排序,置换元组将按排序顺序产生。
元素被视为唯一是基于它们的位置,而不是它们的值。因此,如果输入元素是唯一的,那么在每个排列中就不会有重复的值。
大致相当于:
定义排列(可迭代,r=无):
#排列( ABCD ,2) - AB AC AD BA BC BD CA CB CD DA DB DC
#排列(范围(3)) - 012 021 102 120 201 210
pool=tuple(可迭代)
n=len(池)
如果r不是别人,r=n
如果注册号码:
返回
索引=列表(范围(n))
循环=列表(范围(n,n-r,-1))
产出元组(索引[:r]中我的池[i])
而n:
对于反向的我(范围(r)):
周期数[i] -=1
如果周期数[i]==0:
指数[我:]=指数[i 1:]指数
周期数[i]=n - i
否则:
j=周期数[我]
指数[我],指数[-j]=指数[-j],指数[我]
产出元组(索引[:r]中我的池[i])
破裂
否则:
返回
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。