欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程语言 > python >内容正文

python

Python itertools库详细教程

发布时间:2025/3/20 python 29 豆豆
生活随笔 收集整理的这篇文章主要介绍了 Python itertools库详细教程 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

前言

  • 库的学习地址:https://pymotw.com/2/itertools/

  • 库的官网地址:https://docs.python.org/2/library/itertools.html

在Python中,迭代器(生成器, iterator)在Python中是一种很常用也很好用的数据结构,比起列表(list)来说,迭代器最大的优势就是延迟计算,按需使用,从而提高开发体验和运行效率,以至于在Python 3中map,filter等操作返回的不再是列表而是迭代器,所以,对于读取大文件或者无限集合,最好是使用迭代器。

Python的内置模块 itertools 就是用来操作迭代器的一个模块,包含的函数都是能够创建迭代器来用于 for循环或者 next(), itertools用于高效循环的迭代函数集合,其中很多函数的作用我们平时要写很多代码才能达到,而在运行效率上反而更低,毕竟人家是系统库。

其itertools库中的函数主要分为三类,分别为无限迭代器,有限迭代器,组合迭代器。

一.无限迭代器(Infinite Iterators)

这些函数可以生成无限的迭代器,概述如下:


下面详细学习:

1.count()

count([start=0, step=1]) 接收两个可选整形参数,第一个指定了迭代开始的值,第二个指定了迭代的步长。此外,start参数默认为0,step参数默认为1,可以根据需要来把这两个指定为其他值,或者使用默认参数。

import itertools natuals = itertools.count(1) for n in natuals:print(n)if n > 5:break#输出 1 2 3 4 5 6

因为count() 会创建一个无限的迭代器,所以上述代码会打印出自然数序列,根本停不下来,只能按Ctrl+C退出

2.cycle()

cycle(iterable) 是用一个可迭代对象中的元素来创建一个迭代器,并且复制自己的值,一直无限的重复下去。

import itertools cs = itertools.cycle('ABC') # 注意字符串也是序列的一种 for c in cs:print(c) # 具有无限的输出,可以按ctrl+c来停止#输出 'A' 'B' 'C' 'A' 'B' 'C'

cycle() 同样停不下来,需要Ctrl+C停止。

3.repeat()

repeat(ele, [, n])是将一个元素重复 n 遍或者无穷多变,并返回一个迭代器。不过如果提供第二个参数就可以限定重复次数。

ns = itertools.repeat('A', 5) for n in ns:print(n)#输出 A A A A A

无限序列只有在 for 迭代时才会无限的迭代下去,如果只是创建了一个迭代对象,它不会实现把无限个元素生成出来,事实上也不可能在内存中创建无限多个元素。无限序列虽然可以无限迭代下去,但是我们通常会通过 takewhile() 等函数根据条件判断来截取一个有限的序列:

natuals = itertools.count(1) ns = itertools.takewhile(lambda x: x <= 5, natuals) for n in ns:print n#输出 1 2 3 4 5

二.有限迭代器(Iterators Terminating on the Shortest Input Sequence)

这里的函数有十来个,如下:

下面我们学习几个常用的:

1.chain()

chain(*iterables)可以把多个可迭代对象组合起来,形成一个更大的迭代器。

比如:

for iter in itertools.chain('lebron', 'james'):print(iter)#输出 l e b r o n j a m e s

2 .groupby()

groupby(iterable, key=None) 可以把相邻元素按照 key 函数分组,并返回相应的 key 和 groupby,如果key函数为None,则只有相同的元素才能放在一组。

for key, group in itertools.groupby('AAABBBCCAAA'):print(key, list(group)) #输出 A ['A', 'A', 'A'] B ['B', 'B', 'B'] C ['C', 'C'] A ['A', 'A', 'A']

实际上挑选规则是通过函数完成的,只要作用于函数的两个元素返回的值相等,这两个元素就被认为是在一组的,而函数返回值作为组的key。如果我们要忽略大小写分组,就可以让元素“A”和‘a’都返回相等的key。

for key, group in itertools.groupby('AaaBBbcCAAa', lambda c: c.upper()):print(key, list(group))#输出 A ['A', 'a', 'a'] B ['B', 'B', 'b'] C ['c', 'C'] A ['A', 'A', 'a']

3.itertools.accumulate()

accumulate(iterable, [, func]) 可以计算出一个迭代器,这个迭代器是由特定的二元函数的累计结果生成的,如果不指定的话,默认函数为求和函数。

from itertools import accumulate<br> x = accumulate(range(10)) print(list(x)) [0, 1, 3, 6, 10, 15, 21, 28, 36, 45]

如果我们指定这个累计函数,则还能有不同的用法,例如,指定一个最大值函数,或者自己定义的函数。

from itertools import accumulate# x1 = accumulate(range(10), max) # print(list(x1)) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]x2 = accumulate(range(10), min) print(list(x2)) # [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

三.组合迭代器(Combinatoric Iterators)

组合操作包括排列,笛卡尔积,或者一些离散元素的选择,组合迭代器就是产生这样序列的迭代器,概述如下:

下面我们来看看常用的几个函数:

1.product()

product(*iterables, repeat=1)得到的是可迭代对象的笛卡尔积,*iterables参数表示需要多个可迭代对象。这些可迭代对象之间的笛卡尔积,也可以使用 for 循环来实现例如 product(A, B) 与 ((x, y) for x in A for y in B)就实现一样的功能。

import itertoolsfor i in itertools.product([1,2,3],[4,5,6]):print(i)#输出 (1, 4) (1, 5) (1, 6) (2, 4) (2, 5) (2, 6) (3, 4) (3, 5) (3, 6)

而 repeat() 参数则表示这些可迭代序列重复的次数。例如 product(A, repeat=4)与 product(A, A, A, A)实现的功能一样。

import itertools for i in itertools.product('ab','cd',repeat = 2):print(i)#输出 ('a', 'c', 'a', 'c') ('a', 'c', 'a', 'd') ('a', 'c', 'b', 'c') ('a', 'c', 'b', 'd') ('a', 'd', 'a', 'c') ('a', 'd', 'a', 'd') ('a', 'd', 'b', 'c') ('a', 'd', 'b', 'd') ('b', 'c', 'a', 'c') ('b', 'c', 'a', 'd') ('b', 'c', 'b', 'c') ('b', 'c', 'b', 'd') ('b', 'd', 'a', 'c') ('b', 'd', 'a', 'd') ('b', 'd', 'b', 'c') ('b', 'd', 'b', 'd')

2.permutations()

permutations(iterable, r=None)返回的是一个可迭代元素的一个排列组合,并且是按照顺序的,且不包含重复的结果。

#更多Python相关视频、资料加群778463939免费获取 from itertools import permutationsx = permutations((1,2,3)) print(list(x)) [(1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2), (3, 2, 1)]

当然,第二个参数默认为None,它表示的是返回元组(tuple)的长度,我们来尝试一下传入的第二个参数。

from itertools import permutationsx = permutations((1, 2, 3), 2) print(list(x)) # [(1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2)]

3.combinations()

combinations(iterable, r) 返回的是可迭代对象所有的长度为 r 的子序列,注意这个与前一个函数 permutations不同,permutations返回的是排列,而 combinations() 返回的是组合。

下面对比一下combinations() 与 permutations() 函数:

from itertools import permutations, combinationsx1 = permutations((1, 2, 3)) x2 = combinations((1, 2, 3), 3) x11 = permutations((1, 2, 3), 2) x22 = combinations((1, 2, 3), 2) print(list(x1)) print(list(x2)) print(list(x11)) print(list(x22)) # [(1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2), (3, 2, 1)] # [(1, 2, 3)] # [(1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2)] # [(1, 2), (1, 3), (2, 3)]

4 combinations_with_replacement()

combinations_with_replacement(iterable, r)返回一个可与自身重复的元素组合,用法类似于 combinations。

from itertools import combinations, combinations_with_replacementx1 = combinations((1, 2), 2) x2 = combinations_with_replacement((1, 2), 2) print(list(x1)) print(list(x2)) # [(1, 2)] # [(1, 1), (1, 2), (2, 2)]

结尾给大家推荐一个非常好的学习教程,希望对你学习Python有帮助!

Python基础入门教程推荐:←点击左边蓝色文字就可以跳转观看了

Python爬虫案例教程推荐:←点击左边蓝色文字就可以跳转观看了

总结

以上是生活随笔为你收集整理的Python itertools库详细教程的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。