Python-itertools详解

itertools,用于创建高效迭代器的函数

chain(*iterable)

将多个序列作为一个单独的序列返回,例如:

import itertools
for item in itertools.chain("i", "love", "python"):
    print item

输出结果:

i
l
o
v
e
p
y
t
h
o
n

combinations(interable, r)

返回指定长度的组合,组内的元素不可重复,例如:

import itertools 
for item in itertools.combinations("abc", 2):
    print item

输出结果:

(‘a’, ‘b’)
(‘a’, ‘c’)
(‘b’, ‘c’)

combinations_with_replacement(iterable, r)

返回指定长度的组合,组合内的元素可重复,例如:

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’)

product(*itertools, repeat=1)

返回指定长度的所有组合,可理解为笛卡尔乘积,例如:

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’)

permutations(iterable, r)

返回长度为r的排列,例如:

import itertools
for item in itertools.permutations("abc", 2):
    print item

输出结果:

(‘a’, ‘b’)
(‘a’, ‘c’)
(‘b’, ‘a’)
(‘b’, ‘c’)
(‘c’, ‘a’)
(‘c’, ‘b’)

compress(data, selectors)

返回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’将不会被输出

count(start=0, step=1)

计数器,start为开始,step为递增序列,例如:

import itertools
for item in itertools.count(start=0, step=2):
    print item

输出结果:

0
2
4
6
8

cycle(iterable)

将迭代器无限迭代,例如:

import itertools
for item in itertools.cycle("ab"):
    print item

输出结果:

a
b
a
b

repeat(p_object, times=None)

无限循环迭代器,times为次数,默认无限循环,例如:

import itertools
for item in itertools.repeat("ab"):
    print item 

输出结果:

ab
ab
ab
ab

dropwhile(predicate, iterable)

直到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

takewhile(predicate, iterable)

predicate为真,就返回iterable的数据,如果为假则不再返回,例如:

import itertools
for item in itertools.takewhile(lamdba x: x < 5,[1, 2, 3, 5, 6]):
    print(item)

输出结果:

1
2
3

ifilter(function_or_None, sequence)

返回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

imap(function, *iterable)

相当于迭代器方式的map(),例如:

import itertools
for item in itertools.imap(lambda x, y: x + y, [1, 2, 3] ,[4, 5, 6]):
    print item

输出结果:

5
7
9

islice(iterable, start, stop, step)

切片操作,iterable为迭代器,start起始位置,stop结束位置,step步子。例如:

import itertools
for item in itertools.islice("abcdefg", 0, 5, 2):
    print item

输出结果:

a
c
e

starmap(function, sequence)

返回function的值,sequence为一个可迭代对象,例如:

import itertools
for item in itertools.starmap(lambda x, y: x + y, [(1, 2), (3, 4)]):
    print item

输出结果:

3
7

groupby(iterable, key=None)

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数据进行排序

你可能感兴趣的:(python,python,函数,itertools)