Python中itertools库的四个函数介绍


Posted in Python onApril 06, 2022

1. 引言

在Python开发中,​​itertools​​库经常被忽视,实际上该库中抱恨了一些非常棒的函数,特别是用于处于数据流的函数。在本文中,我们将讨论该库中的十分使用的几个函数,并重点介绍什么时候我们应该考虑使用它们。
闲话少说,我们直接开始吧!

2. accumulate() 函数

第三方库​​itertools​​提供的函数​​accumulate()​​,可以帮助我们对数据流执行累积操作。换句话说,假设我们有一个数据列表[a,b,c,d,e]和一个运算f,那么函数​​accumulate()​​可以帮助我们计算​​f(a,b)​​,​​f(f(a,b),c)​​,​​f(f(f(a,b),c),d)​​,等等。
文字有点不直观,那我们来举个累加的栗子吧!

样例代码如下:

import itertools
data = [3, 4, 6, 2, 1, 9, 0, 7, 5, 8]

res = itertools.accumulate(data, lambda x,y:x+y)
print(list(res))
# [3, 7, 13, 15, 16, 25, 25, 32, 37, 45]

上述函数​​accumulate()​​的作用是:先把3和4相加,然后得到7,再和6相加,得到另一个值,依此类推。

需要注意的是:如果要执行给定3个或更多值的累计操作,则不允许使用该函数,因为accumulate()只接受迭代器,迭代器每次调用next()返回至多1个元素。

3. compress() 函数

函数​​compress()​​可以根据我们的喜好来过滤内容。与函数​​filter()​​函数不同,函数​​compress()​​需要传入相应的标志位来决定是否应该保留每个值。

举个例子会更加直观,相关样例代码如下:

import itertools
data = [3, 4, 6, 2, 1, 9, 0, 7, 5, 8]
selector = [1, 0, 0, 0, 1, 1, 0, 1, 1, 0]
res = itertools.compress(data, selector)
print(list(res))
# [3, 1, 9, 7, 5]

在上面的示例中,如果数据是奇数,则选择器将为 1,否则为 0。因此,函数​​compress()​​ 操作的结果将只是保留原始数据中的奇数。

4. groupby() 函数

在许多情况下,我们会在 Python 中以随机顺序获得一个元组列表,假如我们希望按值对它们进行分组。此时是函数​​ groupby()​​ 发挥作用的完美场景!

函数​​ groupby()​​ 将接受一个可迭代的参数和一个返回值的函数,然后它将按函数返回的值对元组列表进行分组。

例如,我们想按国家对以下城市进行分组:

import itertools

data = [('New York', 'US'), ("Shanghai", "China"),
("LA", 'US'),("Chongqing", "China")]

for city, group in itertools.groupby(sorted(data, key=lambda x: x[1]), lambda x: x[1]):
for i in group:
print("%s is in %s." % (i[0], city))
print("")

# Shanghai is in China.
# Chongqing is in China.

# New York is in US.
# LA is in US.

5. 排列组合操作

排列组合可能是 ​​itertools​​库中最令人惊叹的函数之一,它提供了排列组合运算符!
我们唯一需要做的就是将正确的关键字与输出元组的长度一起传递给相应的函数,

如下例所示:

import itertools
data = [3, 4, 6]

com_res = itertools.combinations(data, 2)
print(list(com_res))
# [(3, 4), (3, 6), (4, 6)]

com_res = itertools.permutations(data, 2)
print(list(com_res))
# [(3, 4), (3, 6), (4, 3), (4, 6), (6, 3), (6, 4)]

com_without_replacement_res = itertools.combinations_with_replacement(data, 2)
print(list(com_without_replacement_res))
# [(3, 3), (3, 4), (3, 6), (4, 4), (4, 6), (6, 6)]

product_res = itertools.product(data, data)
print(list(product_res))
# [(3, 3), (3, 4), (3, 6), (4, 3), (4, 4), (4, 6), (6, 3), (6, 4), (6, 6)]

6 总结

库​​itertools​​对大多数人来说,是一个未被充分利用甚至很少听到的库,但它确实包含一些非常好用的函数。这些函数通常可以帮助我们将代码行数减少到仅一行,使我们的代码看起来更加简洁优雅!

到此这篇关于Python中itertools库的四个函数介绍的文章就介绍到这了,更多相关Python中itertools库内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
采用python实现简单QQ单用户机器人的方法
Jul 03 Python
python简单实现基数排序算法
May 16 Python
Python命令启动Web服务器实例详解
Feb 23 Python
Python时间的精准正则匹配方法分析
Aug 17 Python
python操作小程序云数据库实现简单的增删改查功能
Jun 06 Python
Python中判断子串存在的性能比较及分析总结
Jun 23 Python
django重新生成数据库中的某张表方法
Aug 28 Python
python遍历文件目录、批量处理同类文件
Aug 31 Python
ansible动态Inventory主机清单配置遇到的坑
Jan 19 Python
python rolling regression. 使用 Python 实现滚动回归操作
Jun 08 Python
Python devel安装失败问题解决方案
Jun 09 Python
安装python依赖包psycopg2来调用postgresql的操作
Jan 01 Python
如何用六步教会你使用python爬虫爬取数据
基于Python实现射击小游戏的制作
python使用opencv对图像添加噪声(高斯/椒盐/泊松/斑点)
python DataFrame中stack()方法、unstack()方法和pivot()方法浅析
浅谈Python中对象是如何被调用的
Apr 06 #Python
Python实现猜拳与猜数字游戏的方法详解
python字符串的一些常见实用操作
Apr 06 #Python
You might like
php多层数组与对象的转换实例代码
2013/08/05 PHP
php配置php-fpm启动参数及配置详解
2013/11/04 PHP
PHP5.3与5.5废弃与过期函数整理汇总
2014/07/10 PHP
PHP开发之用微信远程遥控服务器
2018/01/25 PHP
XML+XSL 与 HTML 两种方案的结合
2007/04/22 Javascript
JavaScript多线程的实现方法
2007/05/08 Javascript
jquery选择器-根据多个属性选择示例代码
2013/10/21 Javascript
JavaScript实现生成GUID(全局统一标识符)
2014/09/05 Javascript
Extjs grid panel自带滚动条失效的解决方法
2014/09/11 Javascript
使用jQuery和Bootstrap实现多层、自适应模态窗口
2014/12/22 Javascript
跟我学习javascript的闭包
2015/11/16 Javascript
JavaScript模拟数组合并concat
2016/03/06 Javascript
jquery插件Jplayer使用方法简析
2016/04/22 Javascript
手机端 HTML5使用photoswipe.js仿微信朋友圈图片放大效果
2016/08/25 Javascript
Vue.js 父子组件通讯开发实例
2016/09/06 Javascript
AngularJs ng-repeat 嵌套如何获取外层$index
2016/09/21 Javascript
jQuery实现加入收藏夹功能(主流浏览器兼职)
2016/12/24 Javascript
详解Nuxt.js Vue服务端渲染摸索
2018/02/08 Javascript
原生javascript AJAX 三级联动的实现代码
2018/05/04 Javascript
ES6中Set和Map数据结构,Map与其它数据结构互相转换操作实例详解
2019/02/28 Javascript
vue router 通过路由来实现切换头部标题功能
2019/04/24 Javascript
浅谈Vue组件单元测试究竟测试什么
2020/02/05 Javascript
使用Python脚本将文字转换为图片的实例分享
2015/08/29 Python
浅谈python新手中常见的疑惑及解答
2016/06/14 Python
Python实现二叉树前序、中序、后序及层次遍历示例代码
2019/05/18 Python
新秀丽官方旗舰店:Samsonite拉杆箱、双肩包、皮具
2018/03/05 全球购物
StubHub澳大利亚:购买或出售您的门票
2019/08/01 全球购物
亿企通软件测试面试题
2012/04/10 面试题
毕业生自我推荐
2013/11/04 职场文书
廉政教育心得体会
2014/01/01 职场文书
小学三年级数学教学反思
2014/01/31 职场文书
充分就业社区汇报材料
2014/05/07 职场文书
作文评语怎么写
2014/12/25 职场文书
中学生学习保证书
2015/02/26 职场文书
比赛主持人开场白
2015/05/29 职场文书
Windows Server 2019 域控制器安装图文教程
2022/04/28 Servers