1 itertools.groupby

我们可以通过以下语句导入itertools.groupby

from itertools import groupby

1.1 itertools.groupby函数

1.1函数形式

itertools.groupby(iterable, key=None)

1.2函数参数

  • iterable:可迭代的对象,比如list,dict
  • key:在遍历过程中重新计算每个键值的函数,默认为None

1.3函数返回值

返回连续key和group的迭代器

1.2 itertools.groupby的使用

我们以一个简单的示例来看一下itertools.groupby的作用到底是神马。

from itertools import groupby

if __name__ == '__main__':
    test_list = [1,0,0,0,3,1,5,5,6]

    for key,group in groupby(test_list):
        print(key,list(group))

输出

1 [1]
0 [0, 0, 0]
3 [3]
1 [1]
5 [5, 5]
6 [6]

从上述代码和代码的执行结果上看,itertools.groupby函数就是对迭代器中的元素进行分组,其中返回的key为分组的元素,group为都为key的可迭代器。

然后我们来看一下在itertools.groupby使用对键值操作函数的例子。

from itertools import groupby

if __name__ == '__main__':
    test_list = [1,0,0,0,3,1,5,5,6]

    for key,group in groupby(test_list,key=lambda c: c+1):
        print(key,list(group))

输出

2 [1]
1 [0, 0, 0]
4 [3]
2 [1]
6 [5, 5]
7 [6]

这个例子和第一个例子在分组的本质上没有区别,不过我们添加了一个lambda函数对分组后的key进行操作,让所有的key都加上1。不过这只会改变分组后的key的值,而已分组的group的中的值是不变的。

1.3 itertools.groupby在实际工程中的妙用

在CTC Decode中,不管使用的是Greedy Decode还是Beam Search Decode都会需要去除相邻的重复元素,而这时我们可以使用itertools.groupby,然后保留key,从上述例子的结果上看,key就是输入迭代对象中去除重复元素的新的序列元素。