Python中itertools库的四个函数介绍
作者:sgzqc 发布时间:2021-05-04 14:34:05
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
对大多数人来说,是一个未被充分利用甚至很少听到的库,但它确实包含一些非常好用的函数。这些函数通常可以帮助我们将代码行数减少到仅一行,使我们的代码看起来更加简洁优雅!
来源:https://blog.51cto.com/u_15506603/5165526
猜你喜欢
- 这篇文章主要介绍了Python爬虫爬取煎蛋网图片代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的
- pycharm中导入selenium报错现象: pycharm中输入from selenium import webdriver, sele
- 题目描述724. 寻找数组的中心下标 - 力扣(LeetCode) (leetcode-cn.com)给你一个整数数组 nums
- 最近在学web自动化,记录一下学习过程。此处我选用python3.6+selenium3.0,均用最新版本,以适应未来需求。环境:windo
- 前言最近遇到的几个网站在提交密码时提交的已经是密文,也就是说在网络上传输的密码是密文,这样提升了密码在网络传输中的安全性。后端语言加解密已
- 文件处理流程1.打开文件,得到文件句柄并赋值给一个变量2.通过句柄对文件进行操作3.关闭文件 r模式,默认模式,文件不存在则报错w
- 今天群上面同志们在讨论css3内发光效果,自己也就研究一下,写了个效果出来,涉及css3投影,渐变,蒙版,伪类等知识点,现在写下设计思路,仅
- pytest是python语言中一款强大的单元测试框架,用来管理和组织测试用例,可应用在单元测试、自动化测试工作中。unittest也是py
- 前言又见面了,小伙伴儿们,发现最近大家喜欢看一些简单的小案例?!咳咳,下面进入正题。每个人的电脑里都会有不想让别人知道的隐私,或者是上班时间
- 在工作中,有时会遇见需要将数字转换为条码的问题,每次都需要打开条码转换的网站,一次次的转换后截图,一两个还行,但是当需要转换的数量较多时,就
- 本文实例为大家分享了Python smtplib发送邮件功能的具体代码,供大家参考,具体内容如下解决之前版本的问题,下面为最新版#!/usr
- 也不一定,以前从来没有深入的研究过sql查询,最近买了一本T-SQL查询的书,把以前忽视的问题都记录一下 以前一直模模糊糊的把sqlserv
- 背景:用python画AR模型的时序图。结果:代码:import numpy as npimport matplotlib.pyplot a
- 引子Tornado 是一个网络异步的的web开发框架, 并且可以利用多进程进行提高效率, 下面是创建一个多进程 tornado 程序的例子.
- 今天在刷leetcode的时候,对于179题返回最大数,用python2中的sorted(cmp)会很方便,但是在python3中这一参数被
- Python版本是2.7.9,在win8上测试成功,就是抓取有点慢,本来想用多线程的,有事就罢了。模板之家的网站上的url参数与页数不匹配,
- 一、前言Matplotlib是Python的绘图库,不仅具备强大的绘图功能,还能够在很多平台上使用,和Jupyter Notebook有极强
- 本文实例讲述了Python实现可获取网易页面所有文本信息的网易网络爬虫功能。分享给大家供大家参考,具体如下:#coding=utf-8#--
- 简介对与控件QPushButton中的可以使用setStyleSheet设置它背景图片。具体设置背景图片的方法有两种self.button.
- 引由于需要解决大批量Excel处理的事情,与其手工操作还不如写个简单的代码来处理,大致选了一下感觉还是Python最容易操作。安装库Pyth