itertools,用于创建高效迭代器的函数
将多个序列作为一个单独的序列返回,例如:
import itertools
for item in itertools.chain("i", "love", "python"):
print item
输出结果:
i
l
o
v
e
p
y
t
h
o
n
返回指定长度的组合,组内的元素不可重复,例如:
import itertools
for item in itertools.combinations("abc", 2):
print item
输出结果:
(‘a’, ‘b’)
(‘a’, ‘c’)
(‘b’, ‘c’)
返回指定长度的组合,组合内的元素可重复,例如:
import itertools
for item in itertools.combinations_with_replacement("abc", 2):
print item
输出结果:
(‘a’, ‘a’)
(‘a’, ‘b’)
(‘a’, ‘c’)
(‘b’, ‘b’)
(‘b’, ‘c’)
(‘c’, ‘c’)
返回指定长度的所有组合,可理解为笛卡尔乘积,例如:
import itertools
for item in itertools.product("abc", repeat=2):
print item
输出结果:
(‘a’, ‘a’)
(‘a’, ‘b’)
(‘a’, ‘c’)
(‘b’, ‘a’)
(‘b’, ‘b’)
(‘b’, ‘c’)
(‘c’, ‘a’)
(‘c’, ‘b’)
(‘c’, ‘c’)
返回长度为r的排列,例如:
import itertools
for item in itertools.permutations("abc", 2):
print item
输出结果:
(‘a’, ‘b’)
(‘a’, ‘c’)
(‘b’, ‘a’)
(‘b’, ‘c’)
(‘c’, ‘a’)
(‘c’, ‘b’)
返回selectors列表中为True的data对应的元素,例如:
import itertools
for item in itertools.compress("abcde", selectors=[1, 0, 1, 0, 1]):
print item
输出结果:
a
b
c
若selectors长度与data长度不相等,例如selectors的长度为3,那么data元素中的’d’,’e’将不会被输出
计数器,start为开始,step为递增序列,例如:
import itertools
for item in itertools.count(start=0, step=2):
print item
输出结果:
0
2
4
6
8
…
将迭代器无限迭代,例如:
import itertools
for item in itertools.cycle("ab"):
print item
输出结果:
a
b
a
b
…
无限循环迭代器,times为次数,默认无限循环,例如:
import itertools
for item in itertools.repeat("ab"):
print item
输出结果:
ab
ab
ab
ab
…
直到predicate为真,就返回iterable的后续数据,例如:
import itertools
for item in itertools.dropwhile(lambda x: x < 5, [1, 2, 3, 6, 7, 1, 2]):
print item
输出结果:
6
7
1
2
predicate为真,就返回iterable的数据,如果为假则不再返回,例如:
import itertools
for item in itertools.takewhile(lamdba x: x < 5,[1, 2, 3, 5, 6]):
print(item)
输出结果:
1
2
3
返回function_or_None为True的sequence对应的元素,例如:
import itertools
for item in itertools.ifilter(lambda x: x % 2, range(10):
print item
输出结果:
1
3
5
7
9
python 3.x已经没有了这个函数。与itertools还有一个与ifilter用法相反的函数,ifilterfalse,在python 3.x中已更名为filterfalse
相当于迭代器方式的map(),例如:
import itertools
for item in itertools.imap(lambda x, y: x + y, [1, 2, 3] ,[4, 5, 6]):
print item
输出结果:
5
7
9
切片操作,iterable为迭代器,start起始位置,stop结束位置,step步子。例如:
import itertools
for item in itertools.islice("abcdefg", 0, 5, 2):
print item
输出结果:
a
c
e
返回function的值,sequence为一个可迭代对象,例如:
import itertools
for item in itertools.starmap(lambda x, y: x + y, [(1, 2), (3, 4)]):
print item
输出结果:
3
7
groupby()
函数会扫描整个序列然后查找连续相同的值,在每次迭代时,会返回一个值和一个迭代器对象。假设有这样一组数据:
info_list = [
{"name": "laozhang", "age": 20, "addr": "深圳"},
{"name": "laoli", "age": 22, "addr": "南昌"},
{"name": "laowang", "age": 21, "addr": "广州"},
{"name": "laoyang", "age": 21, "addr": "广州"},
{"name": "laodeng", "age": 23, "addr": "深圳"},
{"name": "laohe", "age": 22, "addr": "南昌"},
{"name": "laoliang", "age": 19, "addr": "深圳"},
{"name": "laowen", "age": 20, "addr": "深圳"}
]
下面,我们使用groupby()
函数对字典列表中的addr
字段进行分组:
from operator import itemgetter
from itertools import groupby
info_list.sort(key=itemgetter("addr")
info = groupby(info_list, key=itemgetter("addr"))
print info
for i, j in info:
print i
for item in j:
print item
# =============打印结果如下=============
0x101edc470>
南昌
{'name': 'laoli', 'age': 22, 'addr': '南昌'}
{'name': 'laohe', 'age': 22, 'addr': '南昌'}
广州
{'name': 'laowang', 'age': 21, 'addr': '广州'}
{'name': 'laoyang', 'age': 21, 'addr': '广州'}
深圳
{'name': 'laozhang', 'age': 20, 'addr': '深圳'}
{'name': 'laodeng', 'age': 23, 'addr': '深圳'}
{'name': 'laoliang', 'age': 19, 'addr': '深圳'}
{'name': 'laowen', 'age': 20, 'addr': '深圳'}
观察打印结果可以看出,groupby()
函数已经完成了对数据的分组。仔细观察代码可以看出,groupby()
要实现分组这一操作,需要一个重要的步骤,那就是需要先对数据进行排序。如果你要对addr
数据进行分组,那么你就必须先对addr
数据进行排序