python中的itertools的使用详解


Posted in Python onJanuary 13, 2020

今天了解了下python中内置模块itertools的使用,熟悉下,看能不能以后少写几个for,嘿嘿?。

1.无穷的迭代器

1.1 count(start,[step])

count()接受两个参数

  • start:循环开始的数字
  • step:循环中的间隔
from itertools import count

"""
无穷的迭代器 count()
"""
c = count(0, 2)
v = next(c)
while v < 10:
  v = next(c)
  print(v, end=',')

1.2 cycle()

cycle就是一while True,无限循环里面的数字。

"""
无穷迭代器 cycle()
"""
from itertools import cycle

c = cycle('ABCD')
for i in range(10):
  print(next(c), end=',')

1.3 repeat(elem,[n])

重复迭代elem,n次

"""
无穷迭代器 repeat()
"""
from itertools import repeat

r = repeat(1, 3)
for i in range(3):
  print(next(r), end=',')

2. 迭代器

2.1 accumulate(p,[func])

使用func的函数对迭代对象p进行累积。

"""
迭代器 accumulate()
"""
from itertools import accumulate

test_list = [i for i in range(1, 11)]
for i in accumulate(test_list): # 默认是operator.add
  print(i, end=',')
print()
for i in accumulate(test_list, lambda x, y: x * y): # operator.mul
  print(i, end=',')

2.2 chain()

chain()中可以放多个迭代对象,然后一一迭代出来。

"""
迭代器 chain()
"""
from itertools import chain

ch = chain([1, 2, 3], {4: 4, 5: 5}, {6, 7, 8}, (9,), [10, [11, 12]])
for i in ch:
  print(i)

2.3 chain.from_iterable()

跟chain不同的地方在于:

  • chain: 可以接受多个迭代对象
  • chain.from_iterable():可以接受一个可以产生迭代对象的迭代器
"""
迭代器 chain.from_iterable()
"""
def gen_iterables():
  for i in range(10):
    yield range(i)

for i in chain.from_iterable(gen_iterables()):
  print(i)

2.4 compress(data,selectors)

这是就是看下这个就知道了s是selectors中的元素。
(d[0] if s[0]), (d[1] if s[1]), ...

"""
迭代器 compress
"""
from itertools import compress

print(list(compress(['A', 'B', 'C', 'D'], [0, 1, 1, 1])))

2.5 dropwhile(pred,seq)

循环开始的条件是,直到遇到第一次不满足pred条件的情况,才开始遍历。

"""
迭代器 dropwhile()
"""
from itertools import dropwhile

l = [1, 7, 6, 3, 8, 2, 10]
print(list(dropwhile(lambda x: x < 3, l)))

2.6 groupby

这个感觉挺有意思的,有点像sql中的group_by。可以对字符串,列表等进行分组。

返回键和,组里的内容

from itertools import groupby

# 对字符串进行分组
for k, g in groupby('11111234567'):
  print(k, list(g))
d = {1: 1, 2: 2, 3: 2}
# 按照字典value来进行分组
for k, g in groupby(d, lambda x: d.get(x)):
  print(k, list(g))

2.7 islice
这个就是对迭代对象进行切割,不支持负数,有点像range(1,10,2)这种

from itertools import islice
print(list(islice('ABCDEFG', 2,3, None)))

2.8 zip_longest

这个和zip很像,不同地方在于:

  • zip结束取决于里面最短的迭代对象
  • zip_longest结束取决于里面最长的迭代对象
from itertools import zip_longest

for x,y in zip_longest([1,2,3],[1,2]):
  print(x,y)
for x,y in zip([1,2,3],[1,2]):
  print(x,y)

排列组合迭代器

3.1 product

相当于 嵌套的for

“”"
排列组合迭代器 product 嵌套的for
“”"
from itertools import product
for i,j in product([1,2,3],[4,5]):
print(i,j

3.2 permutations

全排列,比如输出123的全部情况。(1,2,3),(1,3,2)…

from itertools import permutations
print(list(permutations('123')))

3.3 combinations(p,r)

从p中找出所有长度为r的排列情况… 有顺序

from itertools import combinations
print(list(combinations([1,2,3],2)))

3.4 combinations_with_replacement()

从p中找出所有长度为r的排列情况,有顺序,但包括自身就是会重复的意思。

  • combinations_with_replacement(‘ABCD', 2)
  • AA AB AC AD BB BC BD CC CD DD

了解是了解了,就是用的时候不知道能不能想起来…

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python实现DNS正向查询、反向查询的例子
Apr 25 Python
Python的ORM框架SQLObject入门实例
Apr 28 Python
pandas中的DataFrame按指定顺序输出所有列的方法
Apr 10 Python
对pandas中to_dict的用法详解
Jun 05 Python
python读取一个目录下所有txt里面的内容方法
Jun 23 Python
python实现opencv+scoket网络实时图传
Mar 20 Python
Python request使用方法及问题总结
Apr 26 Python
python如何快速生成时间戳
Jul 21 Python
Python pip使用超时问题解决方案
Aug 03 Python
Python如何设置指定窗口为前台活动窗口
Aug 12 Python
Python Matplotlib绘制两个Y轴图像
Apr 13 Python
详解Golang如何实现支持随机删除元素的堆
Sep 23 Python
python3读取csv文件任意行列代码实例
Jan 13 #Python
pytorch程序异常后删除占用的显存操作
Jan 13 #Python
Python跑循环时内存泄露的解决方法
Jan 13 #Python
PyTorch使用cpu加载模型运算方式
Jan 13 #Python
Python如何读取文件中图片格式
Jan 13 #Python
详解python破解zip文件密码的方法
Jan 13 #Python
PyTorch 随机数生成占用 CPU 过高的解决方法
Jan 13 #Python
You might like
AJAX的跨域访问-两种有效的解决方法介绍
2013/06/22 PHP
PHP启动windows应用程序、执行bat批处理、执行cmd命令的方法(exec、system函数详解)
2014/10/20 PHP
PHP定义字符串的四种方式详解
2018/02/06 PHP
PHP7导出Excel报ERR_EMPTY_RESPONSE解决方法
2019/04/16 PHP
Prototype使用指南之string.js
2007/01/10 Javascript
img的onload的另类用法
2008/01/10 Javascript
createElement动态创建HTML对象脚本代码
2008/11/24 Javascript
DOM 脚本编程中的兄弟节点
2009/10/31 Javascript
JS下拉缓冲菜单示例代码
2013/08/30 Javascript
简单的js图片轮换代码(js图片轮播)
2014/05/06 Javascript
nodejs中实现阻塞实例
2015/03/24 NodeJs
详解Javascript数据类型的转换规则
2016/12/12 Javascript
JS中闭包的经典用法小结(2则示例)
2016/12/28 Javascript
node实现定时发送邮件的示例代码
2017/08/26 Javascript
js Dom实现换肤效果
2017/10/21 Javascript
jQuery实现的两种简单弹窗效果示例
2018/04/18 jQuery
Vue不能检测到Object/Array更新的情况的解决
2018/06/26 Javascript
在vue中使用vue-echarts-v3的实例代码
2018/09/13 Javascript
深入解读Node.js中的koa源码
2019/06/17 Javascript
layui在form表单页面通过Validform加入简单验证的方法
2019/09/06 Javascript
9个JavaScript日常开发小技巧
2020/10/06 Javascript
Python pickle模块用法实例
2015/04/14 Python
Python机器学习logistic回归代码解析
2018/01/17 Python
python实现AES加密解密
2019/03/28 Python
django 前端页面如何实现显示前N条数据
2020/03/16 Python
关于jupyter打开之后不能直接跳转到浏览器的解决方式
2020/04/13 Python
python实现人像动漫化的示例代码
2020/05/17 Python
HTML5之SVG 2D入门2—图形绘制(基本形状)介绍及使用
2013/01/30 HTML / CSS
仓库管理专业个人自我评价范文
2013/11/11 职场文书
财务分析个人的自荐书范文
2013/11/24 职场文书
大学毕业生文采飞扬的自我鉴定
2013/12/03 职场文书
2015年度保密工作总结
2015/04/24 职场文书
导游词之上饶龟峰
2019/10/25 职场文书
为什么mysql字段要使用NOT NULL
2021/05/13 MySQL
详解Nginx 被动检查服务器的存活状态
2021/10/16 Servers
鸿蒙3.0体验感怎么样? 鸿蒙3.0系统评测向
2022/08/14 数码科技