python强大的排列组合库-itertools

 一、【说在前面】

看到这篇文章的大兄弟您们好,我们经常说调包侠、CRUD仔,用来鄙视不会自己造轮子的工程师,不过笔者认为python的精髓就是调库。库很快,自己写大概率更慢。调包侠也是有高低贵贱之分的,今天介绍一个特别好用的库——itertools

这个库会自动产生一些诸如:排列、组合、笛卡尔积、多迭代器整合、zip等。更详细可以看这个官网一手资料。

itertools — Functions creating iterators for efficient looping — Python 3.12.1 documentation

二、【正式介绍】 

(1)无限循环迭代器

  1. count(start[, step]):
    • count() 函数生成一个从 start 开始的无限递增的整数序列。如果提供了 step 参数,则按照步长递增。
    • Arguments:
      • start: 序列的起始值,默认为 0。
      • step: 序列的步长,默认为 1。
    • Results:
      • 生成一个无限递增的整数序列。
    • Example:
      from itertools import count # 从10开始,步长为2,不写默认步长为1
      for i in count(10, 2): print(i)# 10,12,14,16……
  2. cycle(iterable):
    • cycle() 函数接受一个可迭代对象,并无限循环输出该可迭代对象的元素。
    • Arguments:
      • iterable: 要循环的可迭代对象。
    • Results:
      • 无限循环输出可迭代对象的元素。
    • Example:
      from itertools import cycle # 无限循环输出 'A', 'B', 'C' 
      for elem in cycle('ABC'): print(elem)
  3. repeat(elem [,n]):

repeat() 函数生成一个无限重复输出某个元素的序列,或者最多重复 n 次。不写n则会一直重复

Arguments:

elem: 要重复的元素。

n: 最多重复的次数,默认为无限次。

Results:

生成一个无限重复输出元素的序列,或者最多重复 n 次。

Example:

from itertools import repeat # 重复输出数字 10,最多重复 3 次 
for elem in repeat(10, 3): print(elem)

(2)最短序列终止迭代器

1. accumulate(p [,func]):

将可迭代对象中的元素累积起来,可指定累积的函数。

Example:

from itertools import accumulate # 累积和 
result = accumulate([1, 2, 3, 4, 5]) 
print(list(result)) # 输出 [1, 3(1+2), 6(1+2+3), 10, 15]
2. batched(p, n):

将可迭代对象划分为大小为 n 的批次。

Example:

from itertools import batched # 划分为大小为 3 的批次 
result = batched('ABCDEFG', n=3) 
print(list(result)) # 输出 [('A', 'B', 'C'), ('D', 'E', 'F'), ('G',)]
3. chain(p, q, …):

将多个可迭代对象连接成一个单一的迭代器。

Example:

from itertools import chain # 连接两个字符串 result = chain('ABC', 'DEF') 
print(list(result)) # 输出 ['A', 'B', 'C', 'D', 'E', 'F']

4. chain.from_iterable(iterable):

与 chain 类似,但接受一个可迭代对象的可迭代对象。

Example:

from itertools import chain # 连接两个字符串列表 
result = chain.from_iterable(['ABC', 'DEF']) 
print(list(result)) # 输出 ['A', 'B', 'C', 'D', 'E', 'F']

5. compress(data, selectors):

返回一个通过选择器筛选的数据元素序列。

Example:

from itertools import compress # 通过选择器筛选数据 
result = compress('ABCDEF', [1, 0, 1, 0, 1, 1]) # 1有0无
print(list(result)) # 输出 ['A', 'C', 'E', 'F']

6. dropwhile(pred, seq):

返回在预测失败之后的序列元素。

Example:

from itertools import dropwhile # 在预测失败之后的序列元素 
result = dropwhile(lambda x: x < 5, [1, 4, 6, 4, 1])  # 当遇到第一个不满足条件(即大于等于 5)的元素时,停止迭代并返回余下的元素 [6, 4, 1]
print(list(result)) # 输出 [6, 4, 1]

7. filterfalse(pred, seq):

返回使预测结果为假的序列元素。

Example:

from itertools import filterfalse # 使预测结果为假的序列元素 
result = filterfalse(lambda x: x % 2, range(10)) # 与2取模,奇数会留1所以不显示print(list(result)) # 输出 [0, 2, 4, 6, 8]

8. groupby(iterable[, key]):

根据键函数对序列进行分组。

笔者记得,力扣有一道压缩算法,比如sss44444改为s3,45,就可以拿这个做,

Example:

from itertools import groupby # 根据首字母分组 
result = groupby('AAAABBBCCDAABBB') 
for key, group in result: print(key, list(group)) # 输出 # A ['A', 'A', 'A', 'A'] # B ['B', 'B', 'B'] # C ['C', 'C'] # D ['D'] # A ['A', 'A'] # B ['B', 'B', 'B']

9. islice(seq, [start,] stop [, step]):

返回切片后的序列元素。

Example:

from itertools import islice # 切片序列 seq[start:stop:step]
result = islice('ABCDEFG', 2, None)  # 从索引 = 2开始切,这个跟py自带的切片一个道理
print(list(result)) # 输出 ['C', 'D', 'E', 'F', 'G']

10. pairwise(iterable):

返回序列中两两相邻的元素。

  • Example:
    from itertools import pairwise # 两两相邻的元素
    result = pairwise('ABCDEFG') 
    print(list(result)) 
    # 输出 [('A', 'B'), ('B', 'C'), ('C', 'D'), ('D', 'E'), ('E', 'F'), ('F', 'G')]

                

11. starmap(func, seq):
  • 对可迭代对象中的元素应用函数,元素以参数元组的形式传递给函数。
  • Example:
    from itertools import starmap # 应用 pow 函数 
    result = starmap(pow, [(2, 5), (3, 2), (10, 3)])  # 很好理解,本质就是一个map操作
    print(list(result)) # 输出 [32, 9, 1000]

12. takewhile(pred, seq):

返回在预测失败之前的序列元素立即为。

Example:

python复制代码

from itertools import takewhile # 在预测失败之前的序列元素 
result = takewhile(lambda x: x < 5, [1, 4, 6, 4, 1]) 
print(list(result)) # 输出 [1, 4]
13. tee(it, n):

将一个迭代器拆分成多个相同的迭代器。

Example:

from itertools import tee # 将一个迭代器拆分成两个 iter1, iter2 = tee('ABC') print(list(iter1)) # 输出 ['A', 'B', 'C'] 
print(list(iter2)) # 输出 ['A', 'B', 'C']
14. zip_longest(p, q, …):

将多个迭代器中的元素逐个配对,以最长的迭代器为准,可以指定填充值。

Example:

from itertools import zip_longest # 将两个迭代器中的元素逐个配对 
result = zip_longest('ABCD', 'xy', fillvalue='-') 
print(list(result)) # 输出 [('A', 'x'), ('B', 'y'), ('C', '-'), ('D', '-')]

(3)排列、组合、笛卡尔积

1. product(p, q, …, repeat=1)
  • product 函数用于计算多个可迭代对象的笛卡尔积,生成所有可能的组合。它的参数可以是多个可迭代对象,如 p, q, ...,以及一个可选的 repeat 参数,用于指定重复的次数。
  • 例如,如果 p[1, 2]q[3, 4],那么 product(p, q) 将生成 [(1, 3), (1, 4), (2, 3), (2, 4)]
# 示例 1: product
p = [1, 2]
q = [3, 4]
result_product = list(itertools.product(p, q))
print(result_product)  # 输出:[(1, 3), (1, 4), (2, 3), (2, 4)]
2. permutations(iterable, r=None)
  • permutations 函数用于生成可迭代对象中长度为 r 的所有排列。它的参数包括一个可迭代对象 iterable 和一个可选的 r 参数,用于指定生成的排列长度。
  • 例如,如果 iterable[1, 2, 3]r2,那么 permutations(iterable, r) 将生成 [(1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2)],这是长度为 2 的所有可能排列。
# 示例 2: permutations
iterable = [1, 2, 3]
r = 2
result_permutations = list(itertools.permutations(iterable, r))
print(result_permutations)  # 输出:[(1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2)]
3. combinations(iterable, r)
  • combinations 函数用于生成可迭代对象中长度为 r 的所有组合,按照排序顺序生成。它的参数包括一个可迭代对象 iterable 和一个 r 参数,用于指定生成的组合长度。
  • 例如,如果 iterable[1, 2, 3]r2,那么 combinations(iterable, r) 将生成 [(1, 2), (1, 3), (2, 3)],这是长度为 2 的所有可能组合,按照排序顺序生成。
# 示例 3: combinations
iterable = [1, 2, 3]
r = 2
result_combinations = list(itertools.combinations(iterable, r))
print(result_combinations)  # 输出:[(1, 2), (1, 3), (2, 3)]
4. combinations_with_replacement(iterable, r)
  • combinations_with_replacement 函数与 combinations 类似,用于生成可迭代对象中长度为 r 的所有组合,但不要求元素不重复,可以包含重复元素。
  • 例如,如果 iterable[1, 2]r2,那么 combinations_with_replacement(iterable, r) 将生成 [(1, 1), (1, 2), (2, 2)],这是长度为 2 的所有可能组合,包括重复元素。
# 示例 4: combinations_with_replacement
iterable = [1, 2]
r = 2
result_combinations_with_replacement = list(itertools.combinations_with_replacement(iterable, r))
print(result_combinations_with_replacement)  # 输出:[(1, 1), (1, 2), (2, 2)]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/634250.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux网络--- SSH服务

一、ssh服务简介 1、什么是ssh SSH&#xff08;Secure Shell&#xff09;是一种安全通道协议&#xff0c;主要用来实现字符界面的远程登录、远程复制等功能。SSH 协议对通信双方的数据传输进行了加密处理&#xff0c;其中包括用户登录时输入的用户口令&#xff0c;SSH 为建立在…

OpenCV实战:控制手势实现无触摸拖拽功能

前言&#xff1a; Hello大家好&#xff0c;我是Dream。 今天来学习一下如何使用OpenCV来控制手势&#xff0c;瞬间提升操作体验&#xff01;跨越界限&#xff0c;OpenCV手势控制拖拽功能现身。 一、主要步骤及库的功能介绍 1.主要步骤 要实现本次实验&#xff0c;主要步骤如下…

Ubuntu 22.04安装使用easyconnect

EasyConnect 百度百科&#xff0c;EasyConnect能够帮助您在办公室之外使用公司内网的所有系统及应用。在您的公司部署深信服远程应用发布解决方案后&#xff0c;您的公司所有业务系统及应用都可以轻松迁移至移动互联网上。您可以通过手机、PAD等智能移动终端随时随地开展您的业…

CodeReview 小工具

大家开发中有没有遇到一个版本开发的非常杂&#xff0c;开发很多个项目&#xff0c;改动几周后甚至已经忘了自己改了些什么&#xff0c;领导要对代码review的时候&#xff0c;理不清楚自己改过的代码&#xff0c;只能将主要改动的大功能过一遍。这样就很容易造成review遗漏&…

牛客月赛86+cf(edu)好题

思路&#xff1a;前缀和双指针 代码&#xff1a; #include <bits/stdc.h> using namespace std; using i64 int64_t; int main() {cin.tie(nullptr)->sync_with_stdio(false);cout << fixed << setprecision(20);int t 1;for (int ti 0; ti < t; …

展锐T618_虎贲T618紫光展锐安卓核心板规格参数

基于紫光展锐八核T618平台的纯国产化方案&#xff0c;采用了开放的智能Android操作系统&#xff0c;并集成了4G网络、2.5G5G双频WIFI(可支持1*1 MIMO)、BLUETOOTH近距离无线传输技术以及GNSS无线定位技术。用户可以根据特定场合的需求&#xff0c;选择合适的嵌入式ARM核心模块&…

Linux命令手册

简介 Multics&#xff08;大而全&#xff09;项目失败&#xff0c;吸取教训启动Unix&#xff08;小而精&#xff09;&#xff0c;Linus Benedict Torvalds受Unix启发开发初始版本Linux内核&#xff0c;Git也由其开发&#xff0c;目的是为了更好的管理Linux内核开发。Unix是商业…

linux第一个小程序 --- 进度条【简洁】

行缓冲区的概念 结果&#xff1a;先输入hello world然后休眠三秒后结束 当去掉’\n“ 后&#xff0c;结果就变成了先休眠三秒&#xff0c;然后打印hello world后结束。 该现象就证明了缓冲区的存在。 当缓冲区中遇到’‘\n’或者缓冲区被写满后才会被打印出来&#xff0c;在第…

C++轮子 · STL算法和迭代器

STL的六大组件中最主要的是容器和算法这两个,一个泛化数据的存储,一个泛化数据的操作。前面两篇文章我们简单的介绍了STL中的容器,这篇文章将会介绍STL算法以及粘合容器和算法的迭代器。STL是基于模板实现,容器基于模板类,而算法基于模板函数。在具体介绍算法和迭代器之前…

Linux系统:一些趣味小命令

目录 1、小火车 2、小牛 3、随机小趣物 4、开机自启出现 5、其他趣味图可复制 5.1 文字版 5.2 宗教信仰 5.3 手势 5.4 宇宙星际 5.5 其他 前提&#xff1a;先安装epel额外源 [rootlocalhost ~]#yum install epel-release.noarch -y 1、小火车 [rootlocalhost ~]#y…

JS封装本地缓存的设置,读取,移除,清空方法及使用示例

我封装了一个JS通用的缓存管理对象&#xff0c;可以提供缓存的设置&#xff0c;读取&#xff0c;移除&#xff0c;清空操作&#xff0c;使用也很方便&#xff0c;封装方法的代码在最下方。 Q: 为什么不直接用原生的缓存方法&#xff0c;要封装&#xff1f; A1:原生的缓存管理…

mac安装miniconda

1 intel芯片 mkdir -p ~/miniconda3 curl https://repo.anaconda.com/miniconda/Miniconda3-latest-MacOSX-x86_64.sh -o ~/miniconda3/miniconda.sh bash ~/miniconda3/miniconda.sh -b -u -p ~/miniconda3 rm -rf ~/miniconda3/miniconda.sh初始化shell环境 ~/miniconda3/b…

Qt网络通信

1. UDP通信 1.1 udp通信的基本流程 创建套接字 绑定套接字 进行通信 关闭套接字 涉及到的类和信号 QUdpSocket&#xff1a;Udp套接字类&#xff0c;类对象就是一个udp套接字对象 QHostAddress&#xff1a;ip地址类 void readyRead()&#xff1a;信号&#xff0c;当有数据到达可…

[足式机器人]Part2 Dr. CAN学习笔记- Kalman Filter卡尔曼滤波器Ch05-3+4

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN学习笔记 - Kalman Filter卡尔曼滤波器 Ch05-34 3. Step by step : Deriation of Kalmen Gain 卡尔曼增益/因数 详细推导4. Priori/Posterrori error Covariance Martix 误差协方差矩阵 3. Step by step :…

gh0st远程控制——客户端界面编写(一)

1、新建一个基于对话框的MFC程序 ghost内核对unicode支持不好&#xff0c;所以不要勾选 在静态库使用MFC有助于我们的代码供别人使用 2、设置窗口可最大最小化 对话框 》右键属性 3、 为对话框添加列表 一个代表列表框架&#xff0c;一个代表日志框架 分别为2个控件添加唯…

[c++笔记]class,构造函数

1. class&#xff1a;即c的类&#xff0c;与C语言的结构体相近&#xff0c;与结构体相比较&#xff0c;其成员不只有变量&#xff0c;还可以为函数&#xff0c;即类的成员函数&#xff0c;成员函数与普通函数区别在于其作用范围取决于类[1]&#xff1b;通过类定义的内容叫做对象…

Umi3 创建,配置环境,路由传参(代码示例)

目录 创建项目 配置环境 创建脚手架 项目结构及其目录、 路由 配置路由 嵌套路由 编程式导航和声明式导航 声明式导航 编程式导航 约定式路由 路由传参 query传参&#xff08;问号&#xff09; 接收参数 params传参&#xff08;动态传参&#xff09; 接收参数 创…

精品量化公式——“筹码动态”,筹码动态改进版,增加了三个买点信号标识

不多说&#xff0c;直接上效果如图&#xff1a; ► 日线表现 代码评估 技术指标代码评估&#xff1a; 散筹估算: 使用EMA&#xff08;指数移动平均&#xff09;方法计算(WINNER(C*1.1)-WINNER(C*0.9))*70的3日均线&#xff0c;用黄色粗线表示。这是用于估算市场中散户投资者的…

【我与Java的成长记】之多态,重载与重写详解

系列文章目录 能看懂文字就能明白系列 C语言笔记传送门 Java笔记传送门 &#x1f31f; 个人主页&#xff1a;古德猫宁- &#x1f308; 信念如阳光&#xff0c;照亮前行的每一步 文章目录 系列文章目录&#x1f308; *信念如阳光&#xff0c;照亮前行的每一步* 前言一、多态的概…

gitlab 部署项目新分支

公司代码管理平台新切换到gitlab下&#xff0c;上线发版流程随之变更 1新建分支&#xff0c;开发完成&#xff0c;提交新分支 2.去gitlab平台上找到Merge requests 3 点击右上角的New merge request select source branch 选择新建的分支 点击 compare branches and contin…