组合函数
#突破了长度限制,每个元祖中数据不可相同的所有组成方式 combinations()是组合函数 对combinations来说, 元素之间的实际顺序是不予考虑的.也就是说组合('a', 'b')和组合('b', 'a')被认为是相同的组合形式 实例: import itertools a = [1,2,3] n = 0 for i in itertools.combinations(a,2): print(i) n += 1 print(n) 输出为:(可以认为(1,2)和(2,1)为相同的) (1, 2) (1, 3) (2, 3) 3 combinations_with_replacement()也是组合函数 解除了combinations()中的限制, 允许相同的元素得到多次选择.允许超出元素个数限制 实例: import itertools a = [1,2] n = 0 for i in itertools.combinations_with_replacement(a,3): #后面这个参数可以改,突破了最大限度 print(i) n += 1 print(f'最多组合数:{n}') 输出为: (1, 1, 1) (1, 1, 2) (1, 2, 2) (2, 2, 2) 最多组合数:4组合迭代器 组合操作包括排列,笛卡儿积,或者一些离散元素的选择,组合迭代器就是产生这样序列的迭代器。我们来看看这几个函数的用法。
product(*iterables, repeat=1) 得到的是可迭代对象的笛卡儿积,*iterables参数表示需要多个可迭 代对象。这些可迭代对象之间的笛卡儿积 实例: import itertools a = ['a','b','c'] b = [1,2,3] for i in itertools.product(a,b,repeat=1): #repeat为关键字参数,默认为1 print(i) 输出为: ('a', 1) ('a', 2) ('a', 3) ('b', 1) ('b', 2) ('b', 3) ('c', 1) ('c', 2) ('c', 3)其他函数
itertools包自带了三个可以无限迭代的迭代器。这意味着,当你使用他们时,你要知道要的到底是最终会 停止的迭代器,还是需要无限地迭代下去 count() #可以理解为无限制的容器 count(初值=0, 步长=1):count 迭代器会返回从传入的起始参数开始的均匀间隔的数值。count 也可以 接收指定的步长参数。 实例1: import itertools from time import sleep for i in itertools.count(): #默认从0开始,步长为1,在没有指定特定情况下,无线迭代下去. print(i) 输出为: 0 1 2 3 ... 实例2: import itertools from time import sleep for i in itertools.count(10,2): #如果指定了起始参数,那就从起始参数开始,步长为第二个参数 print(i) # if i == 20: 输出为: break #可以添加特定参数.跳出循环 10 12 14 16 18 ... islice(可迭代对象, 迭代次数):从可迭代对象开始,输出 迭代次数个元素后结束。islice 的第二个 参数控制何时停止迭代。但其含义并不是”达到数字 n时停止“,而是”当迭代了 n次之后停止“。 实例: import itertools my_list = [1,2,3,4,5,6,7,8,9,10] for i in itertools.islice(my_list,3): #迭代对象可以是count(n) print(i) # for i in itertools.islice(count(10),5) # print(i) #从10开始,迭代5次 输出为: 1 2 3 (迭代3次,结束) cycle:这里我们创建了一个 for 循环,使其123无限循环 (使可迭代对象无线迭代下去,迭代完一次后,从头开始继续迭代) 实例: import itertools my_list = [1,2,3] for i in itertools.cycle(my_list): #可迭代对象,迭代完成后继续从头开始迭代 print(i) #当然可以加计数器来终止迭代可终止迭代器
accumulate(可迭代对象[, 函数]) #(默认说白了就是累加) accumulate 迭代器将返回累计求和结果,或者传入两个参数的话,由传入的函数累积计算的结果。默认 设定为相加,我们赶快试一试吧: 实例1: import itertools my_list = [i for i in range(0,10)] i = itertools.accumulate(my_list) #相当于0+1+2+3+4+5+6+7+8+9 print(my_list) print(list(i)) 输出为: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] [0, 1, 3, 6, 10, 15, 21, 28, 36, 45] 实例2:(实现了阶乘) import itertools import operator def mul(a,b): return a * b my_list = [i for i in range(1,10)] i = itertools.accumulate(my_list,mul) #operator.mul也实现了相乘的方法 print(1*2*3*4*5*6*7*8*9) print(list(i)) 输出为: 362880 [1, 2, 6, 24, 120, 720, 5040, 40320, 362880]chain() 直白点说就是两个可迭代对象合并为一个
实例: import itertools a = [i for i in range(1,11)] b = ['a','b','c'] print(a + b) print(list(itertools.chain(a,b))) #这种方法更为优雅 输出为: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 'a', 'b', 'c'] [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 'a', 'b', 'c']