当前位置:首页 > 科技  > 软件

itertools:用于处理可迭代对象的模块

来源: 责编: 时间:2024-03-25 17:35:10 117观看
导读Python 有一个内置模块 itertools,从名字可以看出它是专门用来处理可迭代对象的,那么它都支持哪些操作呢?一起来看一下吧。itertools.chain接收多个可迭代对象(或者迭代器)作为参数,返回一个迭代器。它会生成所有输入迭代器

Python 有一个内置模块 itertools,从名字可以看出它是专门用来处理可迭代对象的,那么它都支持哪些操作呢?一起来看一下吧。j3A28资讯网——每日最新资讯28at.com

itertools.chain

接收多个可迭代对象(或者迭代器)作为参数,返回一个迭代器。它会生成所有输入迭代器的元素,就好像这些元素来自一个迭代器一样。j3A28资讯网——每日最新资讯28at.com

import itertoolsc = itertools.chain([1, 2, 3], "abc", {"k1": "v1", "k2": "v2"})# 直接打印的话是一个对象print(c) """<itertools.chain object at 0x00000000029745F8>"""print(list(c)) """1 2 3 a b c k1 k2"""# 还可以使用 chain.from_iterable# 参数接收多个可迭代对象组成的一个可迭代对象c = itertools.chain.from_iterable(    [[1, 2, 3], "abc", {"k1": "v1", "k2": "v2"}])print(list(c)) """1 2 3 a b c k1 k2"""

j3A28资讯网——每日最新资讯28at.com

itertools.zip_longest

从名字上可以看出,功能和内置的 zip 类似。确实如此,就是将多个可迭代对象对应位置的元素组合起来,像拉链(zip)一样。只不过内置的 zip 是 "木桶原理",一方匹配到头了,那么就不匹配了,而 zip_longest 是以长的那一方为基准。j3A28资讯网——每日最新资讯28at.com

import itertools# 内置的 zip 是把多个迭代器对象中的每一个元素按照顺序组合到一个元组中name = ["高老师", "猪哥", "S 佬"]where = ["江苏", "北京", "深圳"]z = zip(name, where)print(z)"""<zip object at 0x00000257F3FEBEC0>"""print(list(z))"""[('高老师', '江苏'), ('猪哥', '北京'), ('S 佬', '深圳')]"""# 但如果两者长度不一致怎么办?name = ["高老师", "猪哥", "S 佬", "xxx"]where = ["江苏", "北京", "深圳"]print(list(zip(name, where)))"""[('高老师', '江苏'), ('猪哥', '北京'), ('S 佬', '深圳')]"""# 可以看到,长度不一致的时候,当一方结束之后就停止匹配# 如果想匹配长的,那么可以使用 itertools 下面的 zip_longestprint(list(itertools.zip_longest(name, where))) """[('高老师', '江苏'), ('猪哥', '北京'), ('S 佬', '深圳'), ('xxx', None)]"""# 默认使用 None 进行匹配,当然我们也可以指定内容print(list(itertools.zip_longest(name, where, fillvalue="中国")))"""[('高老师', '江苏'), ('猪哥', '北京'), ('S 佬', '深圳'), ('xxx', '中国')]"""

j3A28资讯网——每日最新资讯28at.com

itertools.islice

如果一个迭代器里面包含了很多元素,我们只想要一部分的话,可以使用 islice,按照索引从迭代器中返回所选择的元素,并且得到的还是一个迭代器。j3A28资讯网——每日最新资讯28at.com

import itertoolsnum = range(20)# 选择 index=5 到 index=10(不包含)的位置s = itertools.islice(num, 5, 10)print(list(s))  # [5, 6, 7, 8, 9]# 选择开头到 index=5 的位置s = itertools.islice(num, 5)print(list(s))  # [0, 1, 2, 3, 4]# 选择从 index=5 到 index=15(不包含)的位置,步长为 3s = itertools.islice(num, 5, 15, 3)print(list(s))  # [5, 8, 11, 14]

注意:islice 不支持负数索引,因为不知道迭代器有多长,除非全部读取,可是那样的话干嘛不直接转为列表之后再用切片获取呢?j3A28资讯网——每日最新资讯28at.com

之所以使用 islice 这种形式,就是为了在不全部读取的情况下,也能选择出我们想要的部分,所以这种方式只支持从前往后,不能从后往前。j3A28资讯网——每日最新资讯28at.com

itertools.tee

将一个可迭代对象拷贝 n 份。j3A28资讯网——每日最新资讯28at.com

import itertoolsr = [1, 2, 3, 4, 5]i1, i2 = itertools.tee(r, 2)print(list(i1))  # [1, 2, 3, 4, 5]print(list(i2))  # [1, 2, 3, 4, 5]

j3A28资讯网——每日最新资讯28at.com

itertools.countj3A28资讯网——每日最新资讯28at.com

import itertools"""count(start=0, step=1) 返回一个迭代器,负责无限地生成连续的整数接收两个参数:起始(默认为0)和步长(默认为1)等价于:def count(firstval=0, step=1):    x = firstval    while 1:        yield x        x += step"""# 起始值为 5,步长为 2c1 = itertools.count(5, 2)print(list(itertools.islice(c1, 5))) """[5, 7, 9, 11, 13]"""

j3A28资讯网——每日最新资讯28at.com

itertools.cycle

import itertools"""cycle(iterable) 返回一个迭代器,会无限重复里面的内容,直到内存耗尽"""c2 = itertools.cycle("abc")print(list(itertools.islice(c2, 10)))"""['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c', 'a']"""

j3A28资讯网——每日最新资讯28at.com

itertools.repeat

import itertools"""repeat(obj, times=None),无限重复 obj,除非指定 times"""# 重复指定的次数print(list(itertools.repeat("abc", 3))) """['abc', 'abc', 'abc']"""

j3A28资讯网——每日最新资讯28at.com

itertools.dropwhile

删除满足条件的值,注意:是删除。j3A28资讯网——每日最新资讯28at.com

import itertoolsl = [1, 2, 3, 4, 5]drop_l = itertools.dropwhile(lambda x: x < 3, l)# 依旧返回迭代器print(drop_l) """<itertools.dropwhile object at 0x000001AD63AD0488>"""# 可以看到小于3的都被丢掉了print(list(drop_l))  """[3, 4, 5]"""

j3A28资讯网——每日最新资讯28at.com

itertools.takewhile

这个和 filter 是一样的,保留满足条件的值。j3A28资讯网——每日最新资讯28at.com

import itertoolsl = [1, 2, 3, 4, 5]take_l = itertools.takewhile(lambda x: x < 3, l)print(take_l) """<itertools.takewhile object at 0x000001D37F512948>"""print(list(take_l)) """[1, 2]"""filter_l = filter(lambda x: x < 3, l)print(list(filter_l))  """[1, 2]"""

j3A28资讯网——每日最新资讯28at.com

itertools.compress

提供了另一种过滤可迭代对象元素的方法。j3A28资讯网——每日最新资讯28at.com

import itertoolscondition = [True, False, True, True, False]data = [1, 2, 3, 4, 5]print(list(itertools.compress(data, condition))) """[1, 3, 4]"""# 除了指定 True 和 False,还可以使用 Python 其它类型的值# 会以其对应的布尔值作为判断依据condition = [1, 0, "x", "x", {}]  print(list(itertools.compress(data, condition))) """[1, 3, 4]"""

j3A28资讯网——每日最新资讯28at.com

itertools.accumulatej3A28资讯网——每日最新资讯28at.com

accumulate 处理输入的序列,得到一个类似于斐波那契的结果。j3A28资讯网——每日最新资讯28at.com

import itertoolsprint(list(itertools.accumulate(range(5))))  """[0, 1, 3, 6, 10]"""print(list(itertools.accumulate("abcde")))  """["a", "ab", "abc", "abcd", "abcde"]"""# 所以这里的相加还要看具体的含义try:    print(list(itertools.accumulate([[1, 2], (3, 4)])))except TypeError as e:    print(e)      """    can only concatenate list (not "tuple") to list    """    # 这里就显示无法将列表和元组相加# 当然也可以自定义data = [1, 2, 3, 4, 5]method = lambda x, y: x * yprint(list(itertools.accumulate(data, method))) """[1, 2, 6, 24, 120]"""# 可以看到这里的结果就改变了

j3A28资讯网——每日最新资讯28at.com

itertools.productj3A28资讯网——每日最新资讯28at.com

product 则是会将多个可迭代对象组合成一个笛卡尔积。j3A28资讯网——每日最新资讯28at.com

import itertoolsprint(list(itertools.product([1, 2, 3], [2, 3]))) """[(1, 2), (1, 3), (2, 2), (2, 3), (3, 2), (3, 3)]"""

j3A28资讯网——每日最新资讯28at.com

itertools.permutationsj3A28资讯网——每日最新资讯28at.com

import itertoolsdata = [1, 2, 3, 4]print(list(itertools.permutations(data)))# 根据排列组合,显然是 A44,总共 4 * 3 * 2 * 1 = 24 种组合"""[(1, 2, 3, 4), (1, 2, 4, 3), (1, 3, 2, 4), (1, 3, 4, 2), (1, 4, 2, 3), (1, 4, 3, 2),(2, 1, 3, 4), (2, 1, 4, 3), (2, 3, 1, 4), (2, 3, 4, 1), (2, 4, 1, 3), (2, 4, 3, 1),(3, 1, 2, 4), (3, 1, 4, 2), (3, 2, 1, 4), (3, 2, 4, 1), (3, 4, 1, 2), (3, 4, 2, 1),(4, 1, 2, 3), (4, 1, 3, 2), (4, 2, 1, 3), (4, 2, 3, 1), (4, 3, 1, 2), (4, 3, 2, 1)]"""# 结果是 A42,总共 4 * 3 = 12 种组合print(list(itertools.permutations(data, 2)))"""[(1, 2), (1, 3), (1, 4),  (2, 1), (2, 3), (2, 4),  (3, 1), (3, 2), (3, 4),  (4, 1), (4, 2), (4, 3)]"""

j3A28资讯网——每日最新资讯28at.com

itertools.combinationsj3A28资讯网——每日最新资讯28at.com

permutations 显然是考虑了顺序,相当于排列组合里面 A,而 combinations 只考虑元素是否一致,而不管顺序,相当于排列组合里面的 C。j3A28资讯网——每日最新资讯28at.com

import itertools# permutations 只要顺序不同就看做一种结果# combinations 则保证只要元素相同就是同一种结果data = "abcd"print(list(itertools.combinations(data, 3)))  """[('a', 'b', 'c'), ('a', 'b', 'd'), ('a', 'c', 'd'), ('b', 'c', 'd')]"""# 如果拿抽小球来作比喻的话,显然 combinations 是不放回的,也就是不会重复单个的输入元素# 但有时候可能也需要考虑包含重复元素的组合,相当于抽小球的时候有放回# 对于这种情况,可以使用 combinations_with_replacementprint(list(itertools.combinations_with_replacement(data, 3)))"""[('a', 'a', 'a'), ('a', 'a', 'b'), ('a', 'a', 'c'), ('a', 'a', 'd'), ('a', 'b', 'b'),('a', 'b', 'c'), ('a', 'b', 'd'), ('a', 'c', 'c'), ('a', 'c', 'd'), ('a', 'd', 'd'),('b', 'b', 'b'), ('b', 'b', 'c'), ('b', 'b', 'd'), ('b', 'c', 'c'), ('b', 'c', 'd'),('b', 'd', 'd'), ('c', 'c', 'c'), ('c', 'c', 'd'), ('c', 'd', 'd'), ('d', 'd', 'd')]"""

j3A28资讯网——每日最新资讯28at.com

以上就是该模块的用法,但说实话,感觉大部分都没啥卵用。j3A28资讯网——每日最新资讯28at.com

本文链接://www.dmpip.com//www.dmpip.com/showinfo-26-79141-0.htmlitertools:用于处理可迭代对象的模块

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 快速了解CSS表单尺寸属性field-sizing

下一篇: Spring Boot邮件发送教程:步步为营,轻松实现图片附件邮件!

标签:
  • 热门焦点
  • Find N3入网:最高支持16+1TB

    Find N3入网:最高支持16+1TB

    OPPO将于近期登场的Find N3折叠屏目前已经正式入网,型号为PHN110。本次Find N3在外观方面相比前两代有很大的变化,不再是小号的横向折叠屏,而是跟别的厂商一样采用了较为常见的
  • 一加Ace2 Pro真机揭晓 钛空灰配色质感拉满

    一加Ace2 Pro真机揭晓 钛空灰配色质感拉满

    终于,在经过了几波预热之后,一加Ace2 Pro的外观真机图在网上出现了。还是博主数码闲聊站曝光的,这次的外观设计还是延续了一加11的方案,只是细节上有了调整,例如新加入了钛空灰
  • 之家push系统迭代之路

    之家push系统迭代之路

    前言在这个信息爆炸的互联网时代,能够及时准确获取信息是当今社会要解决的关键问题之一。随着之家用户体量和内容规模的不断增大,传统的靠"主动拉"获取信息的方式已不能满足用
  • 一文掌握 Golang 模糊测试(Fuzz Testing)

    一文掌握 Golang 模糊测试(Fuzz Testing)

    模糊测试(Fuzz Testing)模糊测试(Fuzz Testing)是通过向目标系统提供非预期的输入并监视异常结果来发现软件漏洞的方法。可以用来发现应用程序、操作系统和网络协议等中的漏洞或
  • 2纳米决战2025

    2纳米决战2025

    集微网报道 从三强争霸到四雄逐鹿,2nm的厮杀声已然隐约传来。无论是老牌劲旅台积电、三星,还是誓言重回先进制程领先地位的英特尔,甚至初成立不久的新
  • AI芯片初创公司Tenstorrent获三星和现代1亿美元投资

    AI芯片初创公司Tenstorrent获三星和现代1亿美元投资

    Tenstorrent是一家由芯片行业资深人士Jim Keller领导的加拿大初创公司,专注于开发人工智能芯片,该公司周三表示,已经从现代汽车集团和三星投资基金等
  • 微软发布Windows 11新版 引入全新任务栏状态

    微软发布Windows 11新版 引入全新任务栏状态

    近日,微软发布了Windows 11新版,而Build 22563更新主要引入了几周前曝光的平板模式任务栏等,系统更流畅了。更新中,Windows 11加入了专门针对平板优化的任务栏
  • 2021中国国际消费电子博览会与青岛国际软件融合创新博览会新闻发布会隆重举行

    2021中国国际消费电子博览会与青岛国际软件融合创新博览会新闻发布会隆重举行

    9月18日,2021中国国际消费电子博览会与青岛国际软件融合创新博览会新闻发布会在青岛国际新闻中心隆重举行。发布会上青岛市政府领导联袂出席,对本次双展会情
  • 利用职权私自解除被封帐号 Meta开除20多名员工

    利用职权私自解除被封帐号 Meta开除20多名员工

    11月18日消息,据外媒援引知情人士表示,过去一年时间内,Facebook母公司Meta解雇或处罚了20多名员工以及合同工,指控这些人通过内部系统以不当方式重置用户帐号,其
Top
Baidu
map