社区所有版块导航
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 模块

生信菜鸟团 • 4 年前 • 517 次点击  

*此推文对应3.8.5版本

我们之前简单使用涉及过几次迭代器的处理(比如切片时使用 islice),如果直接对其进行操作,多半会报 「TypeError」的错误。今天再拓展的几个 itertools模块的使用

chain()

itertools.chain(*iterables)用于拼接可迭代对象中的所有元素,创建一个新的迭代器。

import itertools
x = itertools.chain("ABC""DEF")
print(list(x))

# 输出结果如下
['A''B''C''D''E''F']

combinations()

itertools.combinations(iterable, r),返回由输入 iterable中元素组成长度为 r 的子序列,可以理解为有序枚举,若元素的值有重复也依样会保留。

import itertools
print(list(itertools.permutations('ABCD'2)))

# 输出结果如下
[('A''B'), ('A''C'), ('A''D'), ('B''C'), ('B''D'), ('C''D')]

## 全排列组合
print(list(itertools.permutations('ABCD'2)))
# 输出结果如下
[('A' 'B'), ('A''C'), ('A''D'), ('B''A'), ('B''C'), ('B''D'), ('C''A'), ('C''B'), ('C''D'), ('D''A'), ('D''B'), ('D''C')]

compress()

itertools.compress(data, selectors),创建一个迭代器,它返回 data 中经 selectors 判断为 True 的元素。迭代器在两者较短的长度处停止。

import itertools
print(list(itertools.compress('ABCDEF', [1,0,1,0,1,1])))

# 输出结果如下
['A''C''E''F']

takewhile()

itertools.takewhile(predicate, iterable),创建一个迭代器,如果 predicate为true,从可迭代对象中返回元素。

import itertools
print(takewhile(lambda x: x<5, [1,4,6,4,1]))

# 输出结果如下
[14]

# 相反就可以使用 dropwhile()
[641]

dropwhile()中,从不满足条件开始,返回其他元素,也就是保留不满足条件的元素。

groupby()

itertools.groupby(iterable, key=None),创建一个迭代器,根据 key 函数的返回值将拥有相同返回值的元素分到一个新的迭代器。

class groupby:
    # [k for k, g in groupby('AAAABBBCCDAABBB')] --> A B C D A B
    # [list(g) for k, g in groupby('AAAABBBCCD')] --> AAAA BBB CC D

更常见的是先限定一个范围,可以用作分类及统计等,举一个网络上的例子:

import itertools
def conditions(score):
    if score > 80:
        return "A"
    elif score >= 60:
        return "B"
    else:
        return "C"

scores = [81828476647859445589]
for m, n in itertools.groupby(scores, key=conditions):
    print(m, list(n))

# 输出结果如下
A [8182 84]
B [766478]
C [594455]
A [89]

需要注意的是,该函数使用的时候需要对函数进行排序,因为 groupby 在实际计算过程中,会随着key的改变,而生成一个新的分组。若要避免分类重复出现,上面的例子中可以通过 sorted()解决。

无限序列

主要有三个,很好理解,

import itertools
# count()
L = itertools.count(start=0, step=1)

# cycle()
L = itertools.cycle(iterable)

# repeat()
L = itertools.repeat(object[, times])

一般情况下,都会使用其他函数进行限制,例如:

import itertools

L = itertools.count(1)
a = itertools.takewhile(lambda x: x <= 10, L)

数据规模小的时候,通过for循环,全部载入内存后,再打印,也没啥问题,但是计算量大的时候,就要考虑如何写出高效利用内存的程序,在节省内存同时还能把事情办好。关于生成器(generator)还有更多的方法,可以参见原文链接。


推荐阅读

Python3.9 值得关注的更新点

python魔法方法是什么

使用Python实现基本初等函数可视化

如何将pdf转换为word 3.0

使用 Python 操作 word文档

如何在 Rstudio 中使用 python 语言 (图文详解)

适用于任何学科| 10个好用的 Python数据可视化库

好看又好用的python可视化包

4种绘制带误差线的柱形图


文末友情推荐
要想真正入门生物信息学建议务必购买全套书籍,一点一滴攻克计算机基础知识,书单在:什么,生信入门全套书籍仅需160 。如果大家没有时间自行慢慢摸索着学习,可以考虑我们生信技能树官方举办的学习班:
数据挖掘学习班第5期(线上直播3周,马拉松式陪伴,带你入门),原价4800的数据挖掘全套课程, 疫情期间半价即可抢购。
生信爆款入门-第7期(线上直播4周,马拉松式陪伴,带你入门),原价9600的生信入门全套课程,疫情期间3.3折即可抢购。
如果你课题涉及到转录组,欢迎添加一对一客服:详见:你还在花三五万做一个单细胞转录组吗?
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/73141
 
517 次点击