Python的内建模块itertools的使用-含排列组合

本文详细介绍Python的itertools模块,包括无限迭代器如count、islice、cycle和repeat,以及可终止迭代器如accumulate、chain、groupby、combinations、combinations_with_replacement和permutations等。通过具体实例展示了如何高效地使用这些工具。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

itertools模块

itertools 是python的迭代器模块,itertools提供的工具相当高效且节省内存。Python的内建模块itertools提供了非常有用的用于操作迭代对象的函数。使用这些工具,你将能够创建自己定制的迭代器用于高效率的循环。

1.无限迭代器

(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

2.可终止迭代器

(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')]

(5)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方法重在排列。

更多:
https://www.jb51.net/article/123094.htm
https://www.liaoxuefeng.com/wiki/897692888725344/983420006222912
https://www.cnblogs.com/haiyan123/p/9804091.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值