python内置模块之itertools
前言
itertools模块是python内置的迭代器模块,定义了可生成多种迭代器的函数,用来代替可迭代对象的遍历等操作,节约内存。
迭代器函数的类型
无限迭代器:包括count、cycle、repeat,用于生成无限序列的迭代器;
有限迭代器:接收一个或多个序列作为参数,进行组合、分组和过滤等;
组合生成器:多个序列的排列、组合等
无限迭代器
count
count本身是一个迭代器,实现了__iter__和__next__方法,用来生成无限的数字序列。
# 参数:
start=0:迭代的起点
step=1:步长
for i in count():
print(i)
if i == 1000:
break
accumulate
accumulate对一个序列的数据进行积累。
# 参数
iterable:可迭代对象
func:指定规则
from itertools import accumulate
print(list(accumulate([1,2,3,4], func=lambda x,y:x + y))) # 这是默认的规则
# 结果
[1, 3, 6, 10]
cycle
迭代器,对迭代对象进行无限的重复迭代。
# 参数:
iterable:可迭代对象
from itertools import cycle
j = 0
for i in cycle(range(2)):
j += 1
print(i) # 结果:0 1 0 1 0 1
if j == 6:
break
repeat
repeat用于反复生成相同的对象,注意它们其实指向的是同一个对象,只是生成了众多的引用。
# 参数
p_object:任何对象;
times:生成的次数,默认是无限的;
from itertools import repeat
for i in repeat([1,2,3], times=2):
print(i)
有限迭代器
迭代器拼接chain
chain可将多个迭代器拼接返回新的迭代器。
# 参数为众多的可迭代对象
from itertools import chain
x = list(chain(range(5),range(4)))
print(x) # [0, 1, 2, 3, 4, 0, 1, 2, 3]
数据筛选compress
compress 可用于对数据进行筛选,当 selectors 的某个元素为 true 时,则保留 data 对应位置的元素,否则去除,data位置不够默认为false。
# 参数
data:待筛选数据
selectors:筛选规则
from itertools import compress
x = list(compress({'name':'','age':''}, [0,1]))
print(x) # ['age']
数据分组groupby
groupby迭代器对可迭代对象的元素按指定的规则分组。
# 参数
data:需要分组的可迭代对象
key:分组规则
from itertools import groupby
x = groupby(['name','age'], key=len)
print([(x, list(y)) for x, y in x]) # [(4, ['name']), (3, ['age'])]
数据过滤
- dropwhile:
# 参数
predicate:过滤函数
iterable:迭代对象
from itertools import dropwhile
print(list(dropwhile(lambda x:x<1,[False,False,1,2,3]))) # [1, 2, 3]
对于 iterable 中的元素,如果 predicate(item) 为 true,则丢弃该元素,否则返回该项及所有后续项;如果所有的元素都返回False,那么全部保留。
- takewhile
# 参数
predicate:过滤函数
iterable:迭代对象
takewhile和dropwhile迭代器刚好相反,对于 iterable 中的元素,如果 predicate(item) 为 true,则保留该元素,只要 predicate(item) 为 false,则立即停止迭代,返回被迭代过的保留的元素。
- filterfalse
from itertools import filterfalse
print(list(filterfalse(None, ['', 1, []])))
filterfalse的过滤条件和内置函数filter刚好相反,保留返回false而丢弃返回True的元素。
ifilter:在py2中存在,py3已去除,使用内置函数filter替代。
starmap
starmap的功能和map函数非常相似,不过starmap的可迭代对象参数必须是元组序列,即它接受多个参数;
from itertools import starmap
print(list(starmap(lambda x:x, [[1,],[3,]])))
数据切片
- islice
# 参数
iterable:可迭代对象,支持字典和集合的切片,但返回的结果未知。
start: 起点
stop:终点
step:步长
from itertools import islice
print(list(islice([5,4,3,4,5,6],1,3,1)))
迭代器重复创建tee
from itertools import tee, takewhile
for t in tee([1,2,3], 4):
print(t)
print(id(t))
tee创建的多个迭代器都是相互独立的对象,默认创建两个独立的迭代器。
打包迭代器
izip:py2中存在,和py3的内置函数zip的功能相同。
zip_longest
# 参数
*iter:多个可迭代对象
fillvalue:缺失值的默认
from itertools import zip_longest
for z in zip_longest([1,2,3],[1,2],fillvalue=10):
print(z)
zip_longest和zip的功能相似,但是zip_longest会将所有的元素迭代完成,不够的用默认值替代。
组合生成器
组合生成器用来求多个序列的排列组合。
- product:求多个可迭代对象的笛卡尔积;
print(list(product('ABC', '123'))
# 结果
[('A', '1'), ('A', '2'), ('A', '3'), ('B', '1'), ('B', '2'), ('B', '3'), ('C', '1'), ('C', '2'), ('C', '3')]
# 其相当于:
def new_product():
res = []
for a in 'ABC':
for b in '123':
res.append((a,b))
return iter(res)
# 显然product的效率要高得多
- permutations:生成元素不可重复的排列;
from itertools import permutations
print(list(permutations('ABC',r=2)))
# 结果
[('A', 'B'), ('A', 'C'), ('B', 'A'), ('B', 'C'), ('C', 'A'), ('C', 'B')]
# 相当于
def new_permutations():
x = 'ABC'
res = []
for i, y in enumerate(x):
for z in x[:]:
if y ==z:
continue
res.append((y,z))
return iter(res)
- combinations:生成元素不可重复的组合;
print(list(combinations('ABC',r=2)))
# 结果
[('A', 'B'), ('A', 'C'), ('B', 'C')]
# 相当于
def new_combinations():
x = 'ABC'
res = []
for i, y in enumerate(x):
for z in x[i + 1:]:
res.append((y,z))
return iter(res)
- combinations_with_replacement:生成元素可重复的组合;
from itertools import combinations_with_replacement
print(list(combinations_with_replacement('ABC',r=2)))
# 相当于
def new_combinations_with_replacement():
x = 'ABC'
res = []
for i, y in enumerate(x):
for z in x[i:]:
res.append((y,z))
return iter(res)
总结
一般来说,如果能够用迭代器的场景尽量使用迭代器,可以极大改善内存使用状况;
本模块比较常用的迭代器为:chain,dropwhile, zip_longest.
参考
python内置模块之itertools的更多相关文章
- Python标准模块--itertools
1 模块简介 Python提供了itertools模块,可以创建属于自己的迭代器.itertools提供的工具快速并且节约内存.开发者可以使用这些工具创建属于自己特定的迭代器,这些特定的迭代器可以用于 ...
- python内置模块(4)
这一部分是python内置模块系列的最后一部分,介绍了一些小巧有用的内置模块. 目录: 1.random 2.shelve 3.getpass 4.zipfile 5.tarfile 6.bisect ...
- python笔记之itertools模块
python笔记之itertools模块 itertools模块包含创建有效迭代器的函数,可以用各种方式对数据进行循环操作,此模块中的所有函数返回的迭代器都可以与for循环语句以及其他包含迭代器(如生 ...
- Python学习笔记【第八篇】:Python内置模块
什么时模块 Python中的模块其实就是XXX.py 文件 模块分类 Python内置模块(标准库) 自定义模块 第三方模块 使用方法 import 模块名 form 模块名 import 方法名 说 ...
- Python内置模块与标准库
Python内置模块就是标准库(模块)吗?或者说Python的自带string模块是内置模块吗? 答案是:string不是内置模块,它是标准库.也就是说Python内置模块和标准库并不是同一种东西. ...
- python内置模块[re]
python内置模块[re] re模块: python的re模块(Regular Expression正则表达式)提供各种正则表达式的匹配操作,在文本解析.复杂字符串分析和信息提取时是一个非常有用的工 ...
- python内置模块[sys,os,os.path,stat]
python内置模块[sys,os,os.path,stat] 内置模块是python自带功能,在使用内置模块时,需要遵循 先导入在 使用 一.sys 对象 描述 sys.argv 命令行参数获取,返 ...
- Python内置模块和第三方模块
1.Python内置模块和第三方模块 内置模块: Python中,安装好了Python后,本身就带有的库,就叫做Python的内置的库. 内置模块,也被称为Python的标准库. Python 2.x ...
- python内置模块collections介绍
目录 python内置模块collections介绍 1.namedtuple 2.deque 3.defaultdict 4.OrderedDict 5.ChainMap 6.Counter 7.小 ...
随机推荐
- js判断浏览器语言实现网站国际化
一般国际化的网站至少是有中.英文两种语言的,然后就是在不同的语言环境下使用不同的语言页面. 1.实现原理 一般实现这种功能的方法,无非就是两种, 第一种,判断浏览器语言类型: 第二种,判断ip所属国家 ...
- 主机 & 虚拟机 & 开发板 三者的恩爱情仇
# 主机 & 虚拟机 & 开发板 > 三者网络连通性,使用ping命令检测 @ Bridge 模式 ## 主机 & 虚拟机 主机与虚拟机相当于一个网络里的两台主机,都有各 ...
- 洛谷 P1436 棋盘分割 解题报告
P1436 棋盘分割 题目描述 将一个8*8的棋盘进行如下分割:将原棋盘割下一块矩形棋盘并使剩下部分也是矩形,再将剩下的两部分中的任意一块继续如此分割,这样割了(n-1)次后,连同最后剩下的矩形棋盘共 ...
- 使用apt-mirror搭建debian本地仓库
apt-mirror能够将官方镜像下载到本地,并保证目录结构与其一致,但是不能对镜像仓库进行修改.如果想要修改镜像仓库,需要使用reprepro. 1.安装apt-mirror # aptitude ...
- 遇到问题----mongodb-----mongorestore报错too many open files甚至mongo服务崩溃
之前运行mongorestore还原mongodb数据库一直都没问题,今天还原的时候 报错too many open files.而且mongo服务经常崩溃需要重启. 问题有两方面: 原因一 一个原因 ...
- CentOS 6.6下配置本地yum源与网络yum源
一.本地yum源 1.系统默认已经安装了可使用yum的软件包,所以可以直接配置: [root@localhost ~]# cd /etc/yum.repos.d/ ...
- go数据类型之基本类型
基本数据类型 数值型 整数 int 64位操作系统默认为int64,32位操作系统为int32,但是类型检查时时int int8 (byte 1字节) int16 (short 2字节) int32 ...
- Python 爬虫入门(二)—— IP代理使用
上一节,大概讲述了Python 爬虫的编写流程, 从这节开始主要解决如何突破在爬取的过程中限制.比如,IP.JS.验证码等.这节主要讲利用IP代理突破. 1.关于代理 简单的说,代理就是换个身份.网络 ...
- STL中的优先级队列priority_queue
priority_queue(queue类似)完全以底部容器为根据,再加上二叉堆(大根堆或者小根堆)的实现原理,所以其实现非常简单,缺省情况下priority_queue以vector作为底部容器.另 ...
- Python之socket(套接字)补充
IO多路复用 I/O多路复用指:通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作. Linux Linux中的 select,poll,e ...