很多人都致力于把Python代码写得更Pythonic,一来更符合规范且容易阅读,二来一般Pythonic的代码在执行上也更有效率。今天就给大家介绍一下Python的系统库itertools。
迭代器(生成器)在Python中是一种很常用也很好用的数据结构,比起列表(list)来说,迭代器最大的优势就是延迟计算,按需使用,从而提高开发体验和运行效率,以至于在Python 3中map,filter等操作返回的不再是列表而是迭代器。
话虽这么说但大家平时用到的迭代器大概只有range了,而通过iter函数把列表对象转化为迭代器对象又有点多此一举,这时候我们今天的主角itertools就该上场了。
简单来说就是累加。
>>> import itertools
>>> x = itertools.accumulate(range(10))
>>> print(list(x))
[0, 1, 3, 6, 10, 15, 21, 28, 36, 45]
可以用来求前缀和
print(list(itertools.accumulate([1,2,3,4])))
# [1, 3, 6, 10]
连接多个列表或者迭代器。
>>> x = itertools.chain(range(3), range(4), [3,2,1])
>>> print(list(x))
[0, 1, 2, 0, 1, 2, 3, 3, 2, 1]
全排列
ps = list(itertools.permutations([1,2,3],2))
print(len(ps)) # 3个中选2个排序 = 3*2 = 6
print(ps)
# 输出
6
[(1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2)]
求列表或生成器中指定数目的元素不重复的所有组合
>>> x = itertools.combinations(range(4), 3)
>>> print(list(x))
[(0, 1, 2), (0, 1, 3), (0, 2, 3), (1, 2, 3)]
允许重复元素的组合
print(list(itertools.combinations_with_replacement([1,2,3],2)))
[(1, 1), (1, 2), (1, 3), (2, 2), (2, 3), (3, 3)]