Python Itertools
Python itertools模块在创建有效的迭代器中非常有用。
在使用任何编程语言编写的几乎每个程序中,迭代始终是经常存在的任务之一。
遍历对象序列并对其进行操作非常普遍。
很多时候,在执行这些通用操作时,我们会错过管理变量的内存使用情况,要迭代的序列大小以及产生代码使用效率低下的风险。
使用Python中的itertools
模块,可以防止其功能发生这种情况。
Python itertools模块
Python itertools模块为我们提供了多种遍历序列的方式。
一些最常见的示例在这里共享。
Python itertools链()
Python itertools的chain()函数仅接受多个iterable并返回单个序列,就好像所有项目都属于该序列一样。
链的语法如下:
itertools.chain(*sequence)
让我们举个例子:
from itertools import * for value in chain([12.3, 2.5, 34.13], ['theitroad', 'Python', 'Java']): print(value)
使用islice()和count()自动执行序列
Itertools的islice()和count()函数使我们可以轻松地快速迭代并切分它们。
让我们提供一个示例代码片段:
from itertools import * for num in islice(count(), 4): print(num) print('I stopped at 4.') for num in islice(count(), 15, 20): print(num) print('I started at 15 and stopped at 20.') for num in islice(count(), 5, 50, 10): print(num) print('I started at 5 and leaped by 10 till 50.')
使用tee()克隆序列
克隆序列的最好方法是使用tee()函数。
请记住,一旦我们克隆为2个序列,就无法使用原始序列。
让我们举个例子:
from itertools import * single_iterator = islice(count(), 3) cloned1, cloned2 = tee(single_iterator) for num in cloned1: print('cloned1: {}'.format(num)) for num in cloned2: print('cloned2: {}'.format(num))
使用cycle()在序列中循环
我们甚至可以遍历一个无限的序列。
这就像循环的链表一样工作。
cycle
的语法如下:
itertools.cycle(sequence)
让我们提供一个示例代码片段:
from itertools import * index = 0 for item in cycle(['Python', 'Java', 'Ruby']): index += 1 if index == 12: break print(index, item)
使用accumulate()进行累加运算
使用accumulate()
函数,我们可以按顺序执行数学运算并返回结果。
就像将数字加到序列中的前一个值。
让我们举个例子:
from itertools import * data = accumulate(range(10)) for item in data: print(item)
让我们尝试像"乘法"这样的另一个运算符:
from itertools import * import operator data = accumulate(range(1, 5), operator.mul) for item in data: print(item)
用dropwhile()过滤项目
使用dropwhile()
函数,我们可以过滤项目序列,直到条件变为False。
一旦变为False,它将停止过滤过程。
dropwhile
的语法如下:
itertools.dropwhile(predicate, sequence)
让我们提供一个示例代码片段:
from itertools import * data = dropwhile(lambda x: x < 5, [3, 12, 7, 1, -5]) for item in data: print(item)
使用takewhile()过滤项目
使用takewhile()
函数,我们可以过滤序列项直到条件变为True。
一旦变为True,它将停止过滤过程。
takewhile
的语法如下:
itertools.takewhile(predicate, sequence)
让我们举个例子:
from itertools import * data = takewhile(lambda x: x < 5, [3, 12, 7, 1, -5]) for item in data: print(item)
用Combines()进行组合
在组合列表中的所有值时,自定义逻辑可能会以多种方式出错。
即使其中itertools模块也具有救援功能。
combinations()
的语法如下:
itertools.combinations(sequence, r)
让我们提供一个示例代码片段:
from itertools import * data = list(combinations('ABCD', 2)) for item in data: print(item)
输出将是:值得注意的是:
如果按顺序对项目进行排序,则组合也将被排序。
如果序列中的项目是唯一的,则组合数据将不包含任何重复的组合。
重复的组合,与groups_with_replacement()
就像上面的combinations()
函数一样。
唯一的区别在于它可以在组合数据中重复。
combinations_with_replacement
的语法如下:
itertools.combinations_with_replacement(sequence, r)
让我们举个例子:
from itertools import * data = list(combinations_with_replacement('ABCD', 2)) for item in data: print(item)
带有compress()的压缩过滤器
使用compress()
函数基于布尔列表轻松进行数据压缩。
compress的语法如下:
itertools.compress(sequence, selector)
让我们提供一个示例代码片段:
from itertools import * filtered = [True, False, False, True, True] to_filter = 'PQRSTUVW' data = list(compress(to_filter, filtered)) for item in data: print(item)