8.6 itertools模块

8.6 itertools模块

本来应该叫“计算排列的懒方法”但是我觉得可以和下一节合并,就改了一个标题。

(1)计算排列的懒方法

>>> import itertools                ①
>>> perms = itertools.permutations([1, 2, 3], 2) ②
>>> next(perms)                   ③
(1, 2)
>>> next(perms)
(1, 3)
>>> next(perms)
(2, 1)                       ④
>>> next(perms)
(2, 3)
>>> next(perms)
(3, 1)
>>> next(perms)
(3, 2)
>>> next(perms)                        ⑤
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration

  1. itertools模块有很多有趣的工具,包含permutations()函数,它可以找到所有组合。
  2. permutations()函数有两个参数,是一组序列和一个数字,这个数字是你所希望的组合中有几个元素。这个函数返回一个迭代器,也就是说返回的值,可以用在for循环中,或任何可以用迭代器的地方。
  3. 第一次计算组合返回了(1,2)
  4. 注意在组合中(2,1)和(1,2)是不同的。
  5. 像(1,1),(2,2)这不是有效的组合,所以不会被列出。当所有的组合都计算完毕后,如果继续迭代,会引发StopIteration异常。

注意:permutations()函数不是一定要用list,它可以是任何序列——甚至是字符串。

(2)计算组合的的工具

>>> list(itertools.combinations(‘ABC’, 2))
[(‘A’, ‘B’), (‘A’, ‘C’), (‘B’, ‘C’)]

在数学上排列是有先后顺序的,也就是(1,2)和(2,1)是不同的,但组合没有顺序也就是(1,2)和(2,1)是相同的。

(3)itertools.groupby(iterable, key = None)分组函数,根据某个函数方法对序列进行分组。

生成一个迭代器,它能从iterable中返回一个连续的关键字和分组。其中的key是一个函数,可以为每个元素计算关键值(key value)。通常iterable是根据key函数排序过的。如果key为空或未设置,就会返回未改变过的元素。

(4)itertools.chain(iterator1,iterator2)链接两个迭代器

>>> list(itertools.chain(range(0, 3), range(10, 13)))
[0, 1, 2, 10, 11, 12]

它可以把第一个迭代器和第二个迭代器链接在一起,返回一个新的迭代器,这个新的迭代器可以迭代全部元素。

(5)zip(iter1,iter2)

翻译起来好难~不写了,很困。。。直接上例子吧!
>>> list(zip(range(0, 3), range(10, 13)))
[(0, 10), (1, 11), (2, 12)]

 

 

发表回复