社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

三十三、深入Python中的itertools模块

Python开发 • 4 年前 • 441 次点击  
👇👇关注后回复 “进群” ,拉你进程序员交流群👇👇

作者丨小sen

来源丨Python之王


「@Author:Runsen」

在Python中有一个功能强大的迭代工具包itertools,是Python自带的标准工具包之一。

product

由于itertools是内置库,不需要任何安装,直接import itertools即可。

product 用于求多个可迭代对象的笛卡尔积(Cartesian Product),它跟嵌套的 for 循环等价.即:

笛卡尔乘积是指在数学中,两个集合X和Y的笛卡尔积(Cartesian product),又称直积,表示为X × Y

product(A, B)和 ``((x,y) for x in A for y in B)`一样.

import itertools
for item in itertools.product([1,2,3],[100,200]):
    print(item)
    
    
# 输出如下
(1, 100)
(1, 200)
(2, 100)
(2, 200)
(3, 100)
(3, 200)

permutations

通俗地讲,permutations就是返回可迭代对象的所有数学或者字符的全排列方式。

全排列,即产生指定数目的元素的所有排列(顺序有关),也就是高中排列组合中的那个A

permutations它接受一个集合对象,然后产生一个元组序列。

比如print(list(itertools.permutations('abc',3))),共有种情况。

items = ['a','b','c']
from itertools import permutations
for i in permutations(items):
    print(i) #排列组合

print(list(itertools.permutations('abc',3))) 
# 输出如下
('a''b''c')
('a''c''b')
('b''a''c')
('b''c''a')
('c''a''b')
('c''b''a')
[('a''b''c'), ('a''c''b'), ('b''a''c'), ('b''c''a'), ('c''a''b'), ('c''b''a')]

如果需要指定长度的所有排列,可以传递一个可选的长度参数r

items = ['a','b','c']
from itertools import permutations
for i in permutations(items,2):
    print(i) #排列组合
    
# 输出如下
('a''b')
('a''c')
('b''a')
('b''c')
('c''a')
('c''b')

combinations

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

itertools.permutations(iter,r)itertools.combinations(iter,r)的区别是:前者是permutations允许重复使用,后者combinations是不能重复使用

>>> print(list(itertools.combinations('abc',3)))
[('a''b''c')]

combinations_with_replacement

combinations_with_replacementcombinations很相似,唯一的不同在于前者combinations_with_replacement集合类型中的数据是可以重复的




    
>>> print(list(itertools.combinations_with_replacement('abc',3)))
[('a''a''a'), ('a''a''b'), ('a''a''c'), ('a''b''b'), ('a''b''c'), ('a''c''c'), ('b''b''b'), ('b''b''c'), ('b''c''c'), ('c''c''c')]

accumulate

accumulate用于对列表中元素逐个累加

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

compress

compress()是筛选工具,它接受一个可迭代对象以及一个布尔选择序列作为输入,输出时会将所有布尔序列中为True的可迭代对象输出。

import itertools

its=["a","b","c","d","e","f","g","h"]
selector=[True,False,1,0,3,False,-2,"y"]
for item in itertools.compress(its,selector):
    print (item)
    
a
c
e
g
h   

count

count(初值=0, 步长=1)是 创建一个迭代器,从传入的起始参数开始的均匀间隔的数值。

我们来看一个简单的例子

from itertools import count
for i in count(10): #从10开始无限循环
    if i > 20: 
        break
    else:
        print(i)


10
11
12
13
14
15
16
17
18
19
20

chain

chain链条,主要用来把多个序列连在一起做迭代。

import itertools
chain = itertools.chain([1, 2, 3], [4, 5, 6])
for c in chain:
   print(c)
1
2
3
4
5
6  

chain还有一个非常重要的功能就是展平列表。

>>> list(itertools.chain([1, 2, 3], [4, 5], [6] ,[7,8]))
[1, 2, 3, 4, 5, 6, 7, 8]

cycle

import itertools
cycle = itertools.cycle([1, 2, 3])
for c in cycle:
   print(c)

运行结果输出 1 2 3 1 2 3……一直周而复始,永不停息。


Reference

[1]

传送门~: https://github.com/MaoliRUNsen/runsenlearnpy100


-End-

最近有一些小伙伴,让我帮忙找一些 面试题 资料,于是我翻遍了收藏的 5T 资料后,汇总整理出来,可以说是程序员面试必备!所有资料都整理到网盘了,欢迎下载!

点击👆卡片,关注后回复【面试题】即可获取

在看点这里好文分享给更多人↓↓

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/114440
 
441 次点击