跳过开头
我们读取文本的时候最常用首先是跳过开始部分,在实际的应用当中,有些信息是给用到数据的程序员看的,当我们通过代码获取数据的时候,显然是希望可以过滤掉这些信息的,比如记录的日志或者是代码等等,一般来说头部都会附上一段说明,或者用注释标注或者是用特殊的符号标记。
比如我们有一段数据,它的开头用#做了一些注释:
# This is a data for student # Rows 100 xiaoming, 17, 99; xiaoli, 18, 98; ...
常规操作当中,我们会创建一个打开文件的迭代器,我们通过遍历这个迭代器去获取文件当中的数据:
with open('xxxx.txt') as f: for line in f: print(line)
如果只是用来输出还好,如果我们需要加工文件当中的数据,那么头部的注释信息就会干扰我们代码的运行。我们当然可以手动加入一些判断,但是这会比较麻烦,代码也不够美观。针对这个问题,一个比较好的解决方案是dropwhile。
dropwhile是itemtools当中的一个函数,它可以接收一个我们自定义的过滤函数和迭代器重新生成一个新的迭代器,这个新的迭代器当中会过滤掉之前迭代器头部不符合我们要求的数据:
在刚才的例子当中我们想要过滤掉头部加了#注释的部分,我们可以这么操作:
from itertools import dropwhile with open('xxxx.txt') as f: for line in dropwhile(lambda line: line.startswith('#'), f): print(line)
这样出来的结果就没有头部我们不需要的内容了。
当我们知道头部不符合情况的数据的格式的时候,可以使用dropwhile来规定过滤的格式。如果我们知道需要过滤的条数,则可以使用另外一个工具,叫做islice,它的本质是一个切片函数,就像是Python当中数组的切片功能一样,可以切出迭代器当中指定片段的数据。
举个例子:
from itertools import dropwhile with open('xxxx.txt') as f: for line in islice(f, 3, None): print(line)
这样我们就会从第三行开始获取,之前的数据会被过滤掉。它其实就代表着数组当中[3: ]的切片操作。
迭代排列组合
我们都知道在C++当中有一个叫做next_permutation的函数,可以传入一个数组,返回下一个字典序的排列。在Python当中也有同样的功能,但是是以迭代器的形式使用的。
举个简单的例子,比如我们有a, b, c三个元素,我们希望求出它的所有排列:
items = ['a', 'b', 'c'] from itertools import permutations for p in permutations(items): print(p)
permutations还支持多传一个参数,比如上述的排列当中我们希望只保留前两个元素,除了切片之外,我们只需要多传一个参数就好了,like this:
for p in permutati