python3-itertools模块和迭代器函数

补充:zip迭代器和zip_longest迭代器

python3中的zip是可迭代的对象,可以节省内存空间

zip(*iterables) #构造函数

zip拼接多个可迭代对象iter1,iter2...的元素,返回新的可迭代对象,其元素为各系列iter1,iter2...对象元素组成的元组。如果各系列iter1,iter2..长度不一致,则截断至最小系列长度。

>>> zip
<class ‘zip‘>
>>> zip((1,2,3),"abc",range(3))
<zip object at 0x0000023E8CB3AC88>
>>> list(zip((1,2,3),"abc",range(3)))
[(1, ‘a‘, 0), (2, ‘b‘, 1), (3, ‘c‘, 2)]
>>> list(zip("abc",range(10)))
[(‘a‘, 0), (‘b‘, 1), (‘c‘, 2)]

多个可迭代对象的元素个数不一致时,如果需要去最大的长度,则需要使用itertools.zip_longest迭代器:zip_longest(*iterables,filvalue=None)  其中吧,fillvalue是填充值,默认为None

>>> import itertools
>>> list(itertools.zip_longest("ABCD","xy",fillvalue="+"))
[(‘A‘, ‘x‘), (‘B‘, ‘y‘), (‘C‘, ‘+‘), (‘D‘, ‘+‘)]

一.无穷序列迭代器

itertools模块包含3个无穷序列的迭代器

  1. count(start=0,step=1) #从start开始,步长为step的无穷序列,start, start+step, start+2*step, ...,count(10) --> 10 11 12 13 14 ...
  2. cycle(iterable)               #可迭代对象iterable“元素”的无限重复,p0, p1, ... plast, p0, p1, ...,cycle(‘ABCD‘) --> A B C D A B C D ...
  3. repeat(object[,time])       #重复对象object无数次(若指定times,则重复times次),repeat(10, 3) --> 10 10 10
>>> from itertools import *
>>> list(zip(count(1),"abcde"))
[(1, ‘a‘), (2, ‘b‘), (3, ‘c‘), (4, ‘d‘), (5, ‘e‘)]
>>> list(zip(range(10),cycle("abc")))
[(0, ‘a‘), (1, ‘b‘), (2, ‘c‘), (3, ‘a‘), (4, ‘b‘), (5, ‘c‘), (6, ‘a‘), (7, ‘b‘), (8, ‘c‘), (9, ‘a‘)]
>>> list(repeat("God",times=3))
[‘God‘, ‘God‘, ‘God‘]

二.累计迭代器

itertools模块的accumulate迭代器用于返回累计和:    accumulate(iterable,[func])

其中,若可迭代对象iterable的元素p0,p1,p2...为数值,则结果为:p0,p0+p1,p0+p1+p2....,如果指定了带两个参数的func,则func代替默认的加法运算

>>> import itertools,operator
>>> list(accumulate((1,2,3,4,5)))
[1, 3, 6, 10, 15]
>>> list(accumulate((1,2,3,4,5),operator.mul))
[1, 2, 6, 24, 120]

三.级联迭代器 chain(用于返回级联元素)

chain(*iterable) #构造函数  连接所有的可迭代对象iterable1,iterable2..,即连接多个可迭代对象的元素,作为一个系列  chain(‘ABC‘, ‘DEF‘) --> A B C D E F

chain的类工厂函数chain.from_iterable(iterable),也可以连接多个序列,,,chain.from_iterable([‘ABC‘, ‘DEF‘]) --> A B C D EF

>>> import itertools
>>> list(chain((1,2,3),"abc",range(5)))
[1, 2, 3, ‘a‘, ‘b‘, ‘c‘, 0, 1, 2, 3, 4]
>>> list(chain.from_iterable(["ABC","DEF"]))
[‘A‘, ‘B‘, ‘C‘, ‘D‘, ‘E‘, ‘F‘]

四.选择压缩迭代器compress (用于返回可迭代对象的部分元素) compress(data,selectors)   compress(‘ABCDEF‘, [1,0,1,0,1,1]) --> A C E F

根据选择器selectors的元素(True/False),返回元素为True对应的data系列中的元素,当data或selectors终止时,停止判断

五.切片迭代器islice(用于返回可迭代对象的切片)  islice(iterable,stop)   islice(iterable, [start,] stop [, step]) #构造函数  islice(‘ABCDEFG‘, 2, None) --> C D E F G

islice返回可迭代对象iterable的切片,从索引位置start(第一个元素为0)开始,到stop(不包括)结束,步长为step(默认为1)。如果stop为None,则直至结束

>>> import itertools
>>> list(islice("ABCDEF",2))
[‘A‘, ‘B‘]
>>> list(itertools.islice("ABCDFEG",2))
[‘A‘, ‘B‘]
>>> list(itertools.islice("ABCDFEG",2,4))
[‘C‘, ‘D‘]
>>> list(itertools.islice("ABCDFEG",2,4,None))
[‘C‘, ‘D‘]
>>> list(itertools.islice("ABCDFEG",2,None))
[‘C‘, ‘D‘, ‘F‘, ‘E‘, ‘G‘]
>>> list(itertools.islice("ABCDFEG",0,None,2))
[‘A‘, ‘C‘, ‘F‘, ‘G‘]

六.迭代器groupby (用于返回可迭代对象的分组)  groupby(iterable,key=None) #构造函数

其中,iterable分带分组的可迭代对象,可选的key为用于计算键值的函数,默认为None,即键值为元素本身。groupby返回的结果为迭代器,其元素为(key,group),其中key是分组的键值,group为iterable中具有相同的key值得元素集合的子迭代器

groups = []
uniquekeys = []
data = sorted(data, key=keyfunc)
for k, g in groupby(data, keyfunc):
    groups.append(list(g))      # Store group iterator as a list
    uniquekeys.append(k)

>>> from itertools import *
>>> data=[1,-2,0,0,-1,-2,1,-1,2,0,0]
>>> data1=sorted(data,key=abs)
>>> for k,g in itertools.groupby(data1,key=abs):
    print(k,list(g))

0 [0, 0, 0, 0]
1 [1, -1, 1, -1]
2 [-2, -2, 2]

七.排列迭代器 permutations(用于系列的排列) permutations(iterable,r=None) #构造函数   返回可迭代对象iterable的元素排列,组合长度为r(默认为系列的长度)

permutations(‘ABCD‘, 2)   AB AC AD BA BC BD CA CB CD DA DB DC

>>> import itertools
>>> list(itertools.permutations([1,2,3],2))
[(1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2)]
>>> list(permutations([1,2,3]))
[(1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2), (3, 2, 1)]

八.笛卡尔积迭代器product(用于系列的笛卡尔积) product(*itertools,repeat=1)  product(‘ABCD‘, repeat=2)  AA AB AC AD BA BB BC BD CA CB CC CD DA DB DC DD

返回可迭代对象itertools1,itertools2...的元素的笛卡尔积,repeat为可迭代对象的重复次数(默认为1)

>>> import itertools
>>> list(itertools.permutations([1,2,3],2))
[(1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2)]
>>> list(permutations([1,2,3]))
[(1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2), (3, 2, 1)]
>>> import itertools
>>> list(itertools.product([1,2],"abc"))
[(1, ‘a‘), (1, ‘b‘), (1, ‘c‘), (2, ‘a‘), (2, ‘b‘), (2, ‘c‘)]
>>> list(product(range(2),repeat=3))
[(0, 0, 0), (0, 0, 1), (0, 1, 0), (0, 1, 1), (1, 0, 0), (1, 0, 1), (1, 1, 0), (1, 1, 1)]
时间: 2024-08-29 06:49:32

python3-itertools模块和迭代器函数的相关文章

python 迭代器 itertools模块中常用工具函数

迭代器 itertools模块中常用工具函数,提供了接近二十个迭代器工具函数. 原文地址:https://www.cnblogs.com/bcyczhhb/p/11809842.html

python中itertools模块zip_longest函数实现逻辑

最近在看流畅的python,在看第14章节的itertools模块,对其itertools中的相关函数实现的逻辑的实现 其中在zip_longest(it_obj1, ..., it_objN, fillvalue=None)时,其函数实现的功能和内置zip函数大致相同(实现一一对应), 不过内置的zip函数是已元素最少对象为基准,而zip_longest函数是已元素最多对象为基准,使用fillvalue的值来填充 以下是自己总结此函数的大致实现方法,和官方方法不同: 思路大致如此: 找出元素个

Python:itertools模块

itertools模块包含创建有效迭代器的函数,可以用各种方式对数据进行循环操作,此模块中的所有函数返回的迭代器都可以与for循环语句以及其他包含迭代器(如生成器和生成器表达式)的函数联合使用. chain(iter1, iter2, ..., iterN): 给出一组迭代器(iter1, iter2, ..., iterN),此函数创建一个新迭代器来将所有的迭代器链接起来,返回的迭代器从iter1开始生成项,知道iter1被用完,然后从iter2生成项,这一过程会持续到iterN中所有的项都被

python itertools模块练习

参考 <python标准库> 也可以参考Vamei博客 列表用着很舒服,但迭代器不需要将所有数据同时存储在内存中. 本章练习一下python 标准库中itertools模块 合并 和 分解 迭代器 1.chain() 处理多个序列,而不比构造一个大的,两个合在一起,遍历就好了 >>> for i in chain(range(3),range(5,9)): ... print i ... 0 1 2 5 6 7 8 >>> 2.izip() 类似zip,可以

PYTHON-进阶-ITERTOOLS模块

PYTHON-进阶-ITERTOOLS模块小结 这货很强大, 必须掌握 文档 链接 pymotw 链接 基本是基于文档的翻译和补充,相当于翻译了 itertools用于高效循环的迭代函数集合 组成 总体,整体了解 无限迭代器 迭代器 参数 结果 例子 count() start, [step] start, start+step, start+2*step, ... count(10) --> 10 11 12 13 14 ... cycle() p p0, p1, ... plast, p0,

python中itertools模块介绍---01

itertools模块中包含了很多函数,这些函数最终都生成一个或多个迭代器,下面对这些函数进行介绍: 为了能够使用itertools中的函数,需要将该模块导入: >>>from itertools import * count(start=0,step=1): 源代码为: def count(start=0,step=1):     n=start     while True:         yield n         n+=step 从源代码可以看出,count函数产生一个生成

python每日一类(5):itertools模块

itertools模块包含创建有效迭代器的函数,可以用各种方式对数据进行循环操作,此模块中的所有函数返回的迭代器都可以与for循环语句以及其他包含迭代器(如生成器和生成器表达式)的函数联合使用. chain(iter1, iter2, ..., iterN): 给出一组迭代器(iter1, iter2, ..., iterN),此函数创建一个新迭代器来将所有的迭代器链接起来,返回的迭代器从iter1开始生成项,知道iter1被用完,然后从iter2生成项,这一过程会持续到iterN中所有的项都被

python高级编程之生成器表达式和itertools模块

# -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' #生成器表达式和itertools模块 #yield 中可以使用圆括号代替中括号 iter0=(x**2 for x  in range(10)if x%2==0) for iter1 in iter0: print iter1 #结果 """ 0 4 16 36 64 """ #这样的表达式被称为生成器或者gene

Python学习笔记—itertools模块

这篇是看wklken的<Python进阶-Itertools模块小结> 学习itertools模块的学习笔记 在看itertools中各函数的源代码时,刚开始还比较轻松,但后面看起来就比较费劲... 1.itertools.count(start=0,step=1) 此函数用来创建一个迭代器,生成从n开始的连续整数,如果忽略n,则从0开始计算 如果超出了sys.maxint,计数器将溢出并继续行-sys.maxint-1开始计算 定义: def count(start=0, step=1):