本节书摘来自异步社区《Python数据科学指南》一书中的第1章,第1.24节,作者[印度] Gopi Subramanian ,方延风 刘丹 译,更多章节内容可以访问云栖社区“异步社区”公众号查看。
1.24 使用itertools
受一些函数式编程语言如Haskell等启发,itertools包含了一些处理可迭代对象的函数,它们能高效地使用内存,运行速度很快。
1.24.1 准备工作
itertools包含了大量的函数,我们对其中的一部分进行演示来了解它们。本节最后部分提供了这些函数的全列表。
1.24.2 操作方法
我们通过一些Python代码示例来演示itertools的使用方法。
# 加载库文件
from itertools import chain,compress,combinations,count,izip,islice
# 1.链的示例,不同的可迭代对象能被组合在一起
a = [1,2,3]
b = ['a','b','c']
print list(chain(a,b)) # prints [1, 2, 3, 'a', 'b', 'c']
# 2.压缩示例,一个数据筛选器,基于第2个对象对第1个对象中的数据进行筛选
a = [1,2,3]
b = [1,0,1]
print list(compress(a,b)) # prints [1, 3]
# 3.对给定的列表,返回长度为n的子序列
a = [1,2,3,4]
print list(combinations(a,2)) # prints [(1, 2), (1, 3), (1, 4), (2,\
3), (2, 4), (3, 4)]
# 4.给定一个起始整数,产生连续的整数
a = range(5)
b = izip(count(1),a)
for element in b:
print element
# 5.从一个可迭代对象中根据索引参数筛选生成另一个可迭代对象,假定我们所需的是一个迭代器,它从输入的迭代器中返回间隔的各个元素
a = range(100)
b = islice(a,0,100,2)
print list(b)
1.24.3 工作原理
第1步很直观,用chain()函数将两个可迭代对象组合在一起,值得注意的是,chain()函数并不会被真正实现直到被调用。请看下面的命令。
>>> chain(a,b)
<itertools.chain object at 0x060DD0D0>
调用chain(a,b)会返回一个链对象,当我们执行下面的命令时,真正的输出结果如下。
>>> list(chain(a,b))
[1, 2, 3, 'a', 'b', 'c']
第2步中描述了compress函数,在本例中,a里的元素是否被选中,依赖于b里对应位置的元素值。如你所见,b里的第2个值为0,因此a里的第2个值没有被选中。
第3步是简单的数学组合,输入列表a,产生了所有两个元素的组合。
第4步讲解了counter对象,给定一个起始值,它可以产生无限的连续数字序列。运行上面的代码,结果如下。
(1, 0)
(2, 1)
(3, 2)
(4, 3)
(5, 4)
这里我们还使用了izip函数(zip和izip函数在前面章节已经介绍过了),输出结果是一个元组,第1个元素由counter提供,第2个则由输入的列表a提供。
第5步解释了islice操作的细节,islice和前面章节介绍过的slice(切片)相同,但是它使用内存更高效,在没有调用之前不会被实现。
关于itertools的函数全列表,请参见:https://docs.python.org/2/library/itertools.html。