*此推文对应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]))
# 输出结果如下
[1, 4]
# 相反就可以使用 dropwhile()
[6, 4, 1]
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 = [81, 82, 84, 76, 64, 78, 59, 44, 55, 89]
for m, n in itertools.groupby(scores, key=conditions):
print(m, list(n))
# 输出结果如下
A [81, 82,
84]
B [76, 64, 78]
C [59, 44, 55]
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)还有更多的方法,可以参见原文链接。
推荐阅读
使用Python实现基本初等函数可视化
如何在 Rstudio 中使用 python 语言 (图文详解)
适用于任何学科| 10个好用的 Python数据可视化库
要想真正入门生物信息学建议务必购买全套书籍,一点一滴攻克计算机基础知识,书单在:什么,生信入门全套书籍仅需160 。如果大家没有时间自行慢慢摸索着学习,可以考虑我们生信技能树官方举办的学习班: