itertools.groupy(iterable, [key])
函数的作用:按照key对迭代器iterable进行分组
函数的返回:tuple,其中第一个元素是groupby后的键值,第二个元素是一个迭代器,包含那些被groupby的对象。
第二个参数key是可选的,如果缺省,那就按照iterable的每个元素分组。如果不缺省,那应该是一个函数,将iterable中的每个元素作用于这个函数。
#举个例子1
from itertools import groupby
L = ['aa','bb','ccc','ddd','csadfa']
for i,k in groupby(L,len):
print i, list(k)
解读:
L是一个list迭代器,其中每个元素都是str;
groupby的第一个参数就是L, 第二个参数是个函数len,将len函数作用于L的每个元素,得到每个字符串的长度为2,2,3,3,6;
然后对这5个数字groupby,得到2,3,6这三个分组;其中,2的组中有’aa’, ‘bb’, 3的组中有’ccc’, ‘ddd’,6的组中有’csadfa’。
groupby的返回是tuple,for循环中i, k分别对应tuple的第0个和第1个元素,i为2时,k为2组中元素组成的迭代器,list(k)就把其中元素作为一个list输出,后两个一样。
输出:
2 ['aa', 'bb']
3 ['ccc', 'ddd']
6 ['csadfa']
#举个例子2
L = [{'date' : 1},{'date' : 2}]
out = [(name, list(group)) for name, group in groupby(L, lambda p:p['date'])]
print out
解读:
L是一个list,其中的每个元素是dictionary
out是一个list,其中的每个元素是一个tuple
groupby的第一个元素是迭代器L,第二个元素是lambda表达式构建的匿名函数,将L的每个元素作为输入。因为L的每个元素p是字典,所以函数的返回值是以date为键值的value。所以groupby的分组是1,2,其中1的分组有元素{‘date’:1}, 2的分组中有元素{‘date’:2}
for循环中name为1时,group是{‘date’:1},list(group)就是[{‘date’:1}]
输出:
[(1, [{'date': 1}]), (2, [{'date': 2}])]
map函数
map(func, iter1, iter2),iter2可选, 也可以有更多的迭代器
通常接收一个函数和一个list迭代器,把函数作用于每一个迭代器中元素,然后返回一个新的list
#举个例子
L = [1, 2, 3, 4, 9]
print map(lambda x:x**2, L)
#返回 [1, 4, 9, 16, 81]
如果迭代器不只一个,那么前面的函数应该接收相应个数的参数,依次从这几个迭代器中取元素。
#举个例子2
L1 = [1, 2, 3, 4, 9]
L2 = [3, 10, 20, 30, 40]
L3 = [10, 20, 30, 40, 50]
print map(lambda a,b,c:a+b+c, L1, L2, L3)
#返回:[14, 32, 53, 74, 99]
enumerate函数
函数接受一个迭代器,然后返回若干元组,元组的第一个值是索引,第二个值是迭代器的元素。
L = [1, 2, 3, 4, 9]
for i, item in enumerate(L):
print i, item
#返回:
0 1
1 2
2 3
3 4
4 9