【学习笔记】Python的itertools模块

Python版本:python3.6.2

参考:http://funhacks.net/2017/02/13/itertools/

itertools模块包含的函数产生的是迭代器,而不是数组。

1. count

count(start=0, step=1)
创建一个从start(默认值为0)开始,以step(默认为1)为步长的无限迭代器。
import itertools

nums = itertools.count()
for i in nums:
    if i > 6:
        break
    print(i)
输出:
0
1
2
3
4
5
6
指定初始值和步长:
import itertools

nums = itertools.count(2, 2)#指定开始值和步长值
for i in nums:
    if i > 6:
        break
    print(i)
输出:
2
4
6

2.cycle

cycle()用于对iterable中的元素反复执行循环:
import itertools

cycle_strings = itertools.cycle('ABC')
i = 1
for string in cycle_strings:
    if i == 10:
        break
    print(i, string)
    i += 1
输出:
1 A
2 B
3 C
4 A
5 B
6 C
7 A
8 B
9 C

3.repeat

repeat()用于反复生成一个object:

import itertools

for item in itertools.repeat('hello world', 3):
    print(item)
输出:

hello world
hello world
hello world
重复的类型可以是字符串、数组等。
import itertools

for item in itertools.repeat([1, 2, 3, 4], 3):
    print(item)
输出:
[1, 2, 3, 4]
[1, 2, 3, 4]
[1, 2, 3, 4]

4.chain

chain(iterable1, iterable2, iterable3, ....)
chain接受多个可迭代对象作为参数,将他们连接起来,最为一个新的迭代器返回。
import itertools

for item in itertools.chain([1, 2, 3], ['a', 'b', 'c']):
    print(item)
输出:
1
2
3
a
b
c

5.compress

compress(data, selectors)
可用于对数据进行筛选,当selectors的某个元素为true时,则保留data对应位置的元素,否则去除:
from itertools import compress

print(list(compress('ABCDEF', [1, 1, 0, 1, 0, 1])))
输出:

['A', 'B', 'D', 'F']
selectors默认为false:
from itertools import compress

print(list(compress('ABCDEF',[True])))
输出:
['A']

6.dropwhile

dropwhile(predicate, iterable)
其中,predicate:函数;iterable:可迭代对象。对于iterable对象,如果predicate为True则丢弃该元素,否则返回该项及所有后续项。
from itertools import dropwhile

print(list(dropwhile(lambda x: x < 5, [1, 3, 6, 2, 1])))
输出:
[6, 2, 1]
其中,lambda是用来创建匿名函数,对应的,用def创建的方法是有名称的。
lambda只是一个表达式,格式:lambda x: 关于x的表达式

7.groupby

groupby(iterable[, keyfunc])
对序列进行分组,iterable是一个可迭代对象,keyfunc是分组函数,用于iterable的连续项进行分组,如果不指定,则默认对iterable中的连续相同项进行分组,返回一个(key, sub-iterator)的迭代器。
from itertools import groupby

for key, value_iter in groupby('aaabbbaaccd'):
    print(key, ':', list(value_iter))
输出:
a : ['a', 'a', 'a']
b : ['b', 'b', 'b']
a : ['a', 'a']
c : ['c', 'c']
d : ['d']
也可指定分组对象:
from itertools import groupby

data = ['a', 'gg', 'bb', 'ccc', 'dd', 'eee', 'f']

for key, value_iter in groupby(data, len):
    print(key, ':', list(value_iter))
输出:
1 : ['a']
2 : ['gg', 'bb']
3 : ['ccc']
2 : ['dd']
3 : ['eee']
1 : ['f']

8.islice

islice(iterable, [start,] stop [, step] )
参数iterable、stop必选,start、step可选。
from itertools import islice

print(list(islice([10, 6, 2, 8, 1, 3, 9], 5)))
输出:
[10, 6, 2, 8, 1]
可指定开始索引和步长:

from itertools import count, islice

print(list(islice(count(), 3, 10, 2)))
输出:
[3, 5, 7, 9]

9.tee

tee(iterable [, n])
从iterable创建n个独立的迭代器,以元组的形式返回,n的默认值为2。

from itertools import tee

iter1, iter2, iter3 = tee('abcd', 3)
print(*iter1, list(iter2), list(iter3))
输出:
a b c d ['a', 'b', 'c', 'd'] ['a', 'b', 'c', 'd']

10.takewhile

takewhile(predicate, iterable)
跟dropwhile(predicate, iterable)对应,当iterable中的元素满足predicate函数时,则保留返回直至不满足函数就立即停止迭代。
from itertools import takewhile

print(list(takewhile(lambda x: x < 5, [1, 3, 6, 2, 1])))
输出:
[1, 3]

11.product

product(iter1, iter2, ... ,iterN, [repeat=1])
用于求多个可迭代对象的笛卡尔积,repeat指定重复生成序列的次数。

例一:

from itertools import product

for item in product('ABCD', 'xy'):
    print(item)
输出:
('A', 'x')
('A', 'y')
('B', 'x')
('B', 'y')
('C', 'x')
('C', 'y')
('D', 'x')
('D', 'y')
例二:
from itertools import product

c = product('ab', range(3))
print(list(c))
输出:
[('a', 0), ('a', 1), ('a', 2), ('b', 0), ('b', 1), ('b', 2)]
例三:
from itertools import product

c = product('aA', 'bB', '1')
print(list(c))
输出:
[('a', 'b', '1'), ('a', 'B', '1'), ('A', 'b', '1'), ('A', 'B', '1')]
指定repeat:
from itertools import product

print(list(product('ABC', repeat=2)))#相当于print(list(product('ABC', 'ABC')))
输出:
[('A', 'A'), ('A', 'B'), ('A', 'C'), ('B', 'A'), ('B', 'B'), ('B', 'C'), ('C', 'A'), ('C', 'B'), ('C', 'C')]

12.permutations

permutations(iterable[ , r])
用于生成一个排列,r:生成排列的元素的的长度,默认为可迭代对象的长度。

from itertools import permutations

print(list(permutations('ABC', 2)))
输出:
[('A', 'B'), ('A', 'C'), ('B', 'A'), ('B', 'C'), ('C', 'A'), ('C', 'B')]

13.combinations

combinations(iterable, r)
用于求序列的组合,r指定生成组合的元素的长度。

from itertools import combinations

print(list(combinations('ABC', 2)))
输出:
[('A', 'B'), ('A', 'C'), ('B', 'C')]
类似:combinations_with_replacement
from itertools import combinations_with_replacement

print(list(combinations_with_replacement('ABC', 2)))
输出:
[('A', 'A'), ('A', 'B'), ('A', 'C'), ('B', 'B'), ('B', 'C'), ('C', 'C')]

你可能感兴趣的:(python)