当前位置: 首页 > 科技观察

深入Python中的itertools模块

时间:2023-03-17 00:53:23 科技观察

Python中有一个强大的迭代工具包itertools,它是Python自带的标准工具包之一。product由于itertools是内置库,所以不需要安装,直接importitertools即可。product用于求多个可迭代对象的笛卡尔积(CartesianProduct),相当于嵌套的for循环。即:笛卡尔积是指数学中的两个集合X和Y的笛卡尔积(Cartesianproduct),又称直积,表示为X×Y。product(A,B)与``((x,y)forxinAforyinB)`.importitertoolsforiteminitertools.product([1,2,3],[100,200]):print(item)#output以下(1,100)(1,200)(2,100)(2,200)(3,100)(3,200)排列通俗地说,排列是返回可迭代对象的所有数学或字符的完整排列。全排列,即产生指定个数元素的所有排列(顺序相关),即高中排列组合中的A。排列,它接受一个集合对象并产生一个元组序列。比如print(list(itertools.permutations('abc',3))),有两种情况。items=['a','b','c']fromitertoolsimportpermutationsforiinpermutations(items):print(i)#排列组合print(list(itertools.permutations('abc',3)))#输出如下('a','b','c')('a','c','b')('b','a','c')('b','c','a')('c','a','b')('c','b','a')[('a','b','c'),('a','c','b'),('b','a','c'),('b','c','a'),('c','a','b'),('c','b','a')]如果需要指定长度的所有排列,则可以传递一个可选的长度参数r。items=['a','b','c']fromitertoolsimportpermutationsforiinpermutations(items,2):print(i)#arrangement#输出如下('a','b')('a','c')('b','a')('b','c')('c','a')('c','b')组合在列表或生成器中查找指定数量的元素所有组合itertools.permutations(iter,r)和itertools.combinations(iter,r)的区别在于:前者允许排列重复使用,而后者组合不可重复使用>>>print(list(itertools.combinations('abc',3)))[('a','b','c')]combinations_with_replacementcombinations_with_replacement和combinations很相似,唯一不同的是前者combinations_with_replacement集合类型中的数据可以重复>>>print(list(itertools.combinations_with_replacement('abc',3)))[('a','a','a'),('a','a','b'),('a','a','c'),('a','b','b'),('a','b','c'),('a','c','c'),('b','b','b'),('b','b','c'),('b','c','c'),('c','c','c')]accumulateaccumulate用于累加e列表中的元素一一>>>importitertools>>>x=itertools.accumulate(range(10))>>>print(list(x))[0,1,3,6,10,15,21,28,36,45]compresscompress()是一个过滤工具,它接受一个可迭代对象和一个布尔选择序列作为输入,并输出所有在布尔序列中为True的可迭代对象。importitertoolsits=["a","b","c","d","e","f","g","h"]选择器=[真,假,1,0,3,假,-2,"y"]foriteminitertools.compress(its,selector):print(item)aceghcountcount(initialvalue=0,stepsize=1)是创建一个迭代器,与传入的起始参数值等间隔。我们来看一个简单的例子,来自itertoolsimportcountforiincount(10):#Startinfiniteloopfrom10ifi>20:breakelse:print(i)1011121314151617181920chainchainchain主要用于将多个序列连接在一起进行迭代。importitertoolschain=itertools.chain([1,2,3],[4,5,6])forcinchain:print(c)123456chain还有一个很重要的功能就是把链表拉平。>>>list(itertools.chain([1,2,3],[4,5],[6],[7,8]))[1,2,3,4,5,6,7,8]cycleimportitertoolscycle=itertools.cycle([1,2,3])forcincycle:print(c)运行结果输出为123123...一直循环下去,永不停歇。