Py学习  »  Python

Python高效编程|itertools 模块

生信菜鸟团 • 3 年前 • 446 次点击  

*此推文对应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
 
446 次点击