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的ORM框架SQLAlchemy入门教程
Apr 28 Python
使用Python中的tkinter模块作图的方法
Feb 07 Python
Python如何生成树形图案
Jan 03 Python
tensorflow实现加载mnist数据集
Sep 08 Python
python3+PyQt5 数据库编程--增删改实例
Jun 17 Python
解决Python设置函数调用超时,进程卡住的问题
Aug 08 Python
python实现飞机大战小游戏
Nov 08 Python
10个Python面试常问的问题(小结)
Nov 20 Python
python3.6连接mysql数据库及增删改查操作详解
Feb 10 Python
使用python的turtle函数绘制一个滑稽表情
Feb 28 Python
Python处理mysql特殊字符的问题
Mar 02 Python
python使用列表的最佳方案
Aug 12 Python
如何用六步教会你使用python爬虫爬取数据
基于Python实现射击小游戏的制作
python使用opencv对图像添加噪声(高斯/椒盐/泊松/斑点)
python DataFrame中stack()方法、unstack()方法和pivot()方法浅析
浅谈Python中对象是如何被调用的
Apr 06 #Python
Python实现猜拳与猜数字游戏的方法详解
python字符串的一些常见实用操作
Apr 06 #Python
You might like
后宫无数却洁身自好的男主,唐三只爱小舞
2020/03/02 国漫
NOD32 v2.70.32 简体中文封装版 提供下载了
2007/02/27 PHP
字母顺序颠倒而单词顺序不变的php代码
2010/08/08 PHP
php ci框架中加载css和js文件失败的解决方法
2014/03/03 PHP
JS异常处理try..catch语句的作用和实例
2014/05/05 PHP
PHP获取用户访问IP地址的5种方法
2016/05/16 PHP
什么是PHP文件?如何打开PHP文件?
2017/06/27 PHP
js和jquery中循环的退出和继续学习记录
2014/09/06 Javascript
js中style.display=""无效的解决方法
2014/10/30 Javascript
使用NodeJs 开发微信公众号(三)微信事件交互实例
2016/03/02 NodeJs
jQuery搜索框效果实现代码(百度关键词联想)
2021/02/25 Javascript
Vue中计算属性computed的示例解读
2017/07/26 Javascript
VUE axios上传图片到七牛的实例代码
2017/07/28 Javascript
细说webpack源码之compile流程-入口函数run
2017/12/26 Javascript
如何为vuex实现带参数的 getter和state.commit
2019/01/04 Javascript
vue回到顶部监听滚动事件详解
2019/08/02 Javascript
浅谈vue项目利用Hbuilder打包成APP流程,以及遇到的坑
2020/09/12 Javascript
python实现DNS正向查询、反向查询的例子
2014/04/25 Python
详解python实现线程安全的单例模式
2018/03/05 Python
浅析Python pandas模块输出每行中间省略号问题
2018/07/03 Python
python实现两张图片的像素融合
2019/02/23 Python
Python整数与Numpy数据溢出问题解决
2019/09/11 Python
python如何判断IP地址合法性
2020/04/05 Python
Python发送邮件封装实现过程详解
2020/05/09 Python
PySide2出现“ImportError: DLL load failed: 找不到指定的模块”的问题及解决方法
2020/06/10 Python
django Model层常用验证器及自定义验证器详解
2020/07/15 Python
Python加载数据的5种不同方式(收藏)
2020/11/13 Python
Django url 路由匹配过程详解
2021/01/22 Python
Html5新特性用canvas标签画多条直线附效果截图
2014/06/30 HTML / CSS
日本高端护肤品牌:Tatcha
2016/08/29 全球购物
俄罗斯电动工具和设备购物网站:Vseinstrumenti.ru
2020/11/12 全球购物
民生工程实施方案
2014/03/22 职场文书
药品销售内勤岗位职责
2015/04/13 职场文书
中学感恩教育活动总结
2015/05/05 职场文书
刑事上诉状(量刑过重)
2015/05/23 职场文书
Unicode中的CJK(中日韩统一表意文字)字符小结
2021/12/06 HTML / CSS