在代码中写出好几个for循环语句有时候会使代码可读性变差,也让缩进变得很不整齐,好在python中有一个模块itertools能解决关于迭代的一些问题,从而简化我们的工作,本文简单介绍一下常用的itertools函数。
注意本文内容主要来自python官方文档,链接:https://docs.python.org/zh-cn/3/library/itertools.html,本文为个人学习记录,大家有更多的疑问也可以再去文档中多多探索。
以下的内容由于篇幅限制,没有举出很多例子,读者可以自行尝试使用,也可以加深印象。
无穷的迭代器
也就是会无限迭代的迭代器,直到手动跳出这个循环。
函数(使用方式为itertools.函数名) []表示可以不传入,有默认值 | 效果 |
---|---|
count(start, [step]) | 从start开始计数,step为每次计数增加的数值(默认为1),会无限迭代下去 |
cycle(“string”) | 将string的内容反复进行无限循环,此处输出为s t r i n g s t r i n g s … |
repeat(“string”, [n]) | 将string重复无限次,若有n输入,那么重复n次即可 |
排列组合迭代器
函数(使用方式为itertools.函数名) []中的内容表示可以不传入,有默认值,l表示可迭代的对象 | 效果 |
---|---|
product(l1,l2) | 笛卡尔积,相当于嵌套的for循环,如product([1,2,3],[‘a’, ‘b’, ‘c’])结果为(1, ‘a’) (1, ‘b’) (1, ‘c’) (2, ‘a’) (2, ‘b’) (2, ‘c’) (3, ‘a’) (3, ‘b’) (3, ‘c’) |
combinations(l, r) | 返回的是元素无顺序的组合结果,r为结果对象中每个值的长度(默认为l全长),如combinations(‘ABC’, 2)–> (‘A’, ‘B’), (‘A’, ‘C’), (‘B’, ‘C’) |
permutations(l, [r]) | 返回元素有顺序的排列组合结果,r为结果对象中每个值的长度(默认为l全长),如permutations(“AB”, 2)–>(‘A’, ‘B’), (‘B’, ‘A’) ,另外 permutations(“ABC”, 2)–>(‘A’, ‘B’), (‘A’, ‘C’), (‘B’, ‘A’), (‘B’, ‘C’), (‘C’, ‘A’), (‘C’, ‘B’) |
combinations_with_replacement(l, r) | 和上面的方法不同的地方在于此处l中的元素只能向后去组合,如combinations_with_replacement(‘ABC’, 2)–>(‘A’, ‘A’) (‘A’, ‘B’) (‘A’, ‘C’) (‘B’, ‘B’) (‘B’, ‘C’) (‘C’, ‘C’) |
其它重要的迭代器
函数(使用方式为itertools.函数名) []中的内容表示可以不传入,有默认值,l表示可迭代的对象 | 效果 |
---|---|
accumulate(l, [func]) | 累加的函数,可以将l对象中的所有数累加一次。例如accumulate([1, 2, 3, 4])的结果为1 3 6 10 (即1, 1+2, 1+2+3, 1+2+3+4)。此外还可以传入func改变累计产生的变化(不再是累加,而是传入的函数的功能) |
chain(“str1”, “str2”) | 将传入的每个str都遍历一次,此处的结果为s t r 1 s t r 2 |
chain.from_iterable(l) | 同上,但是是从一个可迭代的变量(如列表,元组等)中迭代 |
compress(l1, l2) | 输入两个列表,后面列表中的值决定之前列表中的值是否要保留(通过0,1的方式,0表示不保存) |
dropwhile(judge, l) | 有简单的判断,经过判断后,保留可迭代对象中从第一个不满足条件的值和之后所有的值,如dropwhile(lambda x: x<5, [2,3,6,1, 3]) --> 6 1 3 |
takewhile(judge, l) | 与dropwhile相反,保留在第一个不满足条件的值和之前所有的值,如dropwhile(lambda x: x<5, [2,3,6,1, 3]) --> 2 3 6 |
filterfalse(judge, l) | 选出可迭代对象中所有满足filter条件的值(即过滤掉错误值),如 filterfalse(lambda x: x%2, range(10)) --> 0 2 4 6 8 |
groupby(l, key) | 通过key对对象进行分组,例如[{“name”:“xiaohei”, “age”:“3”}, {“name”:“xiaobai”, “age”:“5”}, {“name”:“xiaohuang”, “age”:“5”}, {“name”:“xiaolv”, “age”:“3”}]这样的列表可以通过age关键字来进行分组 |
islice(l, start, stop, step) | 制作切片 |
starmap(func, l) | 对l对象中的每个值都执行func函数 |
tee(l) | 复制多个迭代器 |
zip_longest(l1,l2) | 将两个对象的值进行一一对应的组合(不论是字符串或是可迭代对象都行),如zip_longest([1,4,6,4,1], [1, 4, 2], fillvalue=0) -->(1, 1) (4, 4) (6, 2) (4, 0) (1, 0) |