Python Itertools

时间:2020-02-23 14:42:51  来源:igfitidea点击:

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)