python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python的itertools

Python的内建模块itertools的使用解析

作者:生有涯,知无涯

这篇文章主要介绍了Python的内建模块itertools的使用解析,itertools是python的迭代器模块,itertools提供的工具相当高效且节省内存,Python的内建模块itertools提供了非常有用的用于操作迭代对象的函数,需要的朋友可以参考下

itertools模块

itertools 是python的迭代器模块,itertools提供的工具相当高效且节省内存。Python的内建模块itertools提供了非常有用的用于操作迭代对象的函数。

使用这些工具,你将能够创建自己定制的迭代器用于高效率的循环。

无限迭代器

(1)count(初值=0, 步长=1):

count 迭代器会返回从传入的起始参数开始的均匀间隔的数值。count 也可以接收指定的步长参数。

"""count(初值,步长)"""
from itertools import count
for i in count(10, 2):  # 从10开始,每步长隔2,无限循环(此案例演示大于100退出)
    if i > 100:
        break
    else:
        print(i)   # 打印结果:10,12,14,16,18,...,98,100

(2)islice(iterable,start,stop,步长)

从 10 开始,输出 5 个元素后结束。islice 的第二个参数控制何时停止迭代。但其含义并不是”达到数字 5 时停止“,而是”当迭代了 5 次之后停止“。

"""isslice(迭代器,迭代次数)"""
from itertools import islice
for i in islice(count(10), 5):
    print(i)   # 打印结果:10,11,12,13,14
for j in islice([1, 2, 3, 4, 5], 2):
    print(j)   # 打印结果:1,2 

(3)cycle:

这里我们创建了一个 for 循环,使其在三个字母 XYZ 间无限循环。当然,我们并不真地想要永远循环下去,所以我们添加了一个简单的计数器来跳出循环。

from itertools import cycle
count = 0
for item in cycle('XYZ'):
    if count > 7:
        break
    print(item)   # X,Y,Z,X,Y,Z,X,Y
    count += 1

(4)repeat():

负责把一个元素无限重复下去,不过如果提供第二个参数就可以限定重复次数:

from itertools import repeat
for i in repeat('1', 5):
    print(i)  # 1,1,1,1,1

可终止迭代器

(1)accumulate(可迭代对象[, 函数])   

accumulate 迭代器将返回累计求和结果,或者传入两个参数的话,由传入的函数累积计算的结果。默认设定为相加

from itertools import accumulate
for i in accumulate(range(7)):
    print(i)  # 0,1,3,6,10,15,21
for i in accumulate([1, 2, 3, 4, 5], lambda x, y: x * y):
    print(i)  # 1,2,6,24,120

(2)chain(*可迭代对象)   

chain 迭代器能够将多个可迭代对象合并成一个更长的可迭代对象。

from itertools import chain
x = chain(range(3), range(3, 5), [5, 6, 7], (8, 9), '11')
print(list(x))  # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, '1', '1']

(3)groupby() groupby()把迭代器中相邻的重复元素挑出来放在一起:

from itertools import groupby
for key, group in groupby('AAABBBCCAAA'):
    print(key, list(group))
# 结果:
"""
A ['A', 'A', 'A']
B ['B', 'B', 'B']
C ['C', 'C']
A ['A', 'A', 'A']
"""

也可以使用函数,按照分组函数的值对元素进行分组

from itertools import groupby
x = groupby(range(10), lambda x: x < 5 or x > 8)
for condition, numbers in x:       
    print(condition, list(numbers))
# 结果:
"""
True [0, 1, 2, 3, 4]
False [5, 6, 7, 8]
True [9]
"""

(4)itertools.combinations(可迭代对象,组合个数)

求列表或生成器中指定数目的元素不重复的所有组合。

(5)itertools.combinations_with_replacement(可迭代对象,组合个数) 允许重复元素的组合

from itertools import combinations, combinations_with_replacement
x = combinations(['A', 'B', 'C'], 2)
y = combinations_with_replacement(['A', 'B', 'C'], 2)
print(list(x))  # [('A', 'B'), ('A', 'C'), ('B', 'C')]
print(list(y))  # [('A', 'A'), ('A', 'B'), ('A', 'C'), ('B', 'B'), ('B', 'C'), ('C', 'C')]

(6)itertools.permutations(可迭代对象,组合个数) 产生指定数目的元素的所有排列(顺序有关)

from itertools import permutations
x = permutations(['A', 'B', 'C'], 3)
print(list(x))  # [('A', 'B', 'C'), ('A', 'C', 'B'), ('B', 'A', 'C'), ('B', 'C', 'A'), ('C', 'A', 'B'), ('C', 'B', 'A')]

itertools中combinations与permutations函数区别

import itertools
s = [1, 2, 3]
print(itertools.permutations(s, 2))     # 结果是一个迭代器
print(itertools.combinations(s, 2))     # 结果是一个迭代器
print(list(itertools.permutations(s, 2)))  # [(1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2)]
print(list(itertools.combinations(s, 2)))  # [(1, 2), (1, 3), (2, 3)]

permutations和combinations都是得到一个迭代器。

combinations方法重点在组合,permutations方法重在排列。

到此这篇关于Python的内建模块itertools的使用解析的文章就介绍到这了,更多相关Python的itertools内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文