ANSHENG'S BLOG
Python itertools指南
# pythonpublishDate · 2018-12-16 / lastEditedTime · 2022-04-06 04:50:00

那些迭代比你想象中的更为强大。

什么是迭代?

简单的说,迭代是可以被for循环使用的数据类型,Python中常见的迭代器是列表。

colors = ['red', 'orange', 'yellow', 'green']

在上面的例子中,我们创建了一个字符串列表,我们已经给这个列表命名为colors

我们可以使用for循环来迭代,下面的的列表中将输出列表中的每一个元素。

for color in colors: print(color)

Python中有许多不同种类的迭代,但是在本教程中,我们将使用列表。

要求

我们必须导入该itertools模块才能使用它,我们还将导入operator模块。

以下所有示例将包含这些导入。

import itertools import operator

itertools

accumulate()

itertools.accumulate(iterable [,func])

该函数会返回函数结果的迭代器,函数可以是变量来传递。accumulate()函数将一个函数作为参数。它也需要一个迭代。它返回所有的结果,结果本身包含在一个迭代器中。

  • Example
data = [1, 2, 3, 4, 5] result = itertools.accumulate(data, operator.mul) for each in result: print(each)
  • Example
1 2 6 24 120

operator.mul需要两个数字并乘以它们

>>> import operator >>> operator.mul(1, 2) 2 >>> operator.mul(2, 3) 6 >>> operator.mul(6, 4) 24 >>> operator.mul(24, 5) 120

在下一个例子中将会使用该max功能

  • Example
data = [5, 2, 6, 4, 5, 9, 1] result = itertools.accumulate(data, max) for each in result: print(each)
  • Example
5 5 6 6 6 9 9

max函数返回最大的项

>>> max(5, 2) 5 >>> max(5, 6) 6 >>> max(6, 4) 6 >>> max(6, 5) 6 >>> max(6, 9) 9 >>> max(9, 1) 9

传递函数是可选的

  • Example
data = [5, 2, 6, 4, 5, 9, 1] result = itertools.accumulate(data) for each in result: print(each)
  • Output
5 7 13 17 22 31 32

如果没有指定功能,项目将相加。

5 5 + 2 = 7 7 + 6 = 13 13 + 4 = 17 17 + 5 = 22 22 + 9 = 31 31 + 1 = 32

count()

itertools.count(start=0, step=1)

迭代器每次返回start+step的值

  • Example

返回1-10之间的所有奇数

for i in itertools.count(1, 2): if i > 10: break else: print(i)
  • Output
1 3 5 7 9

cycle()

itertools.cycle(iterable)

无限循环迭代器中的每一个元素

  • Example
colors = ['red', 'orange', 'yellow', 'green', 'blue', 'violet'] for color in itertools.cycle(colors): print(color)

在上面的代码中,我们创建一个列表,然后我们循环或循环遍历这个列表。通常,一个for循环逐步循环,直到它到达结束。如果一个列表有3个项目,循环将重复3次。但是如果我们使用这个cycle()功能的话。当我们到达迭代的结束时,我们从一开始就重新开始。

  • Output
red orange yellow green blue indigo violet red orange yellow green ...

repeat()

itertools.repeat(object[, times])

此功能将一遍又一遍地重复一个对象,除非有一个times次数。

  • Example
for i in itertools.repeat("spam"): print(i)

在上面的代码中,我们创建一个可重复的迭代spam,它会不停地循环输出spam

  • Output
spam spam spam spam spam spam ...
  • Example
for i in itertools.repeat("spam", 3): print(i)

如果我们使用times参数,可以限制它将重复的次数。

  • Output
spam spam spam

在这个例子中,spam只重复三次

chain()

itertools.chain(*iterables)

此函数需要一系列迭代,并将其返回为一个长的迭代。

  • Example
colors = ['red', 'orange', 'yellow', 'green', 'blue'] shapes = ['circle', 'triangle', 'square', 'pentagon'] result = itertools.chain(colors, shapes) for each in result: print(each)
  • Output
red orange yellow green blue circle triangle square pentagon

compress()

itertools.compress(data, selectors)

这个函数可以使用另一个过滤器来迭代

  • Example
shapes = ['circle', 'triangle', 'square', 'pentagon'] selections = [True, False, True, False] result = itertools.compress(shapes, selections) for each in result: print(each)
  • Output
circle square

dropwhile()

itertools.dropwhile(predicate, iterable)

做一个迭代器,只要返回为true,就从iterable中删除元素,否则就返回后面的每个元素

  • Example
data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1] result = itertools.dropwhile(lambda x: x < 5, data) for each in result: print(each)
  • Output
5 6 7 8 9 10 1

好。这可以令人困惑 代码说,当项目小于5时,删除每个项目。遇到不少于5的项目后,返回剩下的项目。这就是为什么最后一个被归还。

  • Step Through It
1 < 5: True, drop 2 < 5: True, drop 3 < 5: True, drop 4 < 5: True, drop 5 < 5: False, return surviving items

groupby()

itertools.groupby(iterable, key=None)

简单地说,这个功能将事情集中在一起

  • Example
robots = [ { 'name': 'blaster', 'faction': 'autobot' }, { 'name': 'galvatron', 'faction': 'decepticon' }, { 'name': 'jazz', 'faction': 'autobot' }, { 'name': 'metroplex', 'faction': 'autobot' }, { 'name': 'megatron', 'faction': 'decepticon' }, { 'name': 'starcream', 'faction': 'decepticon' } ] for key, group in itertools.groupby(robots, key=lambda x: x['faction']): print(key) print(list(group))
  • Output
autobot [{'name': 'blaster', 'faction': 'autobot'}] decepticon [{'name': 'galvatron', 'faction': 'decepticon'}] autobot [{'name': 'jazz', 'faction': 'autobot'}, {'name': 'metroplex', 'faction': 'autobot'}] decepticon [{'name': 'megatron', 'faction': 'decepticon'}, {'name': 'starcream', 'faction': 'decepticon'}]

filterfalse()

itertools.filterfalse(predicate, iterable)

这个函数使迭代器从iterable中过滤元素,只返回的元素False