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


猜你喜欢
- 前言:常见的加密算法基本分为这几类:线性散列算法(签名算法)MD5,sha1对称性加密算法 AES DES非对称性加密算法 RSA一、md5
- 前言本文使用 cpu 版本的 tensorflow 2.4 ,在 shakespeare 数据的基础上使用 Skip-Gram 算法训练词嵌
- 本文实例为大家分享了JavaScript实现点击出现子菜单的具体代码,供大家参考,具体内容如下首先让我们看一下点击出现子菜单的效果如下图:点
- 步骤很简单,直接进入主题。第一步:创建一个python项目。解析器什么的自己选择,环境目录默认就好。第二步:下载scrapy,步骤file-
- mysql exists与not exists实例详解tableA|column1 | column1 |column3 |tableb|c
- 升序import pandas as pdimport numpy as npdata = np.random.randint(low=2,
- 【导读】亚马逊的 Alexa 的巨大成功已经证明:在不远的将来,实现一定程度上的语音支持将成为日常科技的基本要求。整合了语音识别的 Pyth
- 问题描述:已经用pip install jieba安装好jieba分词工具,但是在Jupyter 里import jieba运行一直提示Im
- 运行vue项目报错 Module build failedModule build failed (from ./node_modules/
- 一、前提由于我安装了几次,我就不再讲述报错了,有点打脑壳!!!提前把相关依赖和报错就地解决。1、所需源码包mysql-8.0.19.tar.
- 用for循环和海龟绘图实现漂亮的螺旋线A.课程内容本节课通过绘制复杂的螺旋线来深入学习for循环和range()函数的用法。深入了解循环的程
- 尽量避免使用DOM。当需要反复使用DOM时,先把对DOM的引用存到JavaScript本地变量里再使用。使用设置innerHTML的方法来替
- 1.文档对象模型(DOM)DOM是HTML和XML文档的编程基础,它定义了处理执行文档的途径。编程者可以使用DOM增加文档、定位文档结构、填
- 近期做那个python的开发,今天就来简单的写一下Django安装配置mysql的方法步骤安装mysql首先安装pymysqlpip ins
- 具体环境:Ubuntu 14.04 Python 2.7.6 Django 1.7.1 Virtualenv name:test Nginx
- 多个值合并展示现在我们有如图一到图二的需求怎么做?如下sql:SELECT id,GROUP_CONCAT(DISTINCT str) as
- 本文实例讲述了Python flask框架post接口调用。分享给大家供大家参考,具体如下:from flask import Flask,
- 接上篇Mysql数据库性能优化二对表进行水平划分 &nbs
- 本文实例总结了Python3.5字符串常用操作。分享给大家供大家参考,具体如下:一、输入与输出#输入与输出str = input("
- PHP fprintf() 函数实例把一些文本写入到名为 "test.txt" 的文本文件:<?php $numb