首页 > 技术文章 > python之itertools模块

dwithy 2019-10-11 11:34 原文

一、介绍

  itertools 是python的迭代器模块,itertools提供的生成迭代器的函数,相当高效且节省内存。使用这些工具,你将能够创建自己定制的迭代器用于高效率的循环。

 

 


 

 

二、速查表

无限迭代器:

迭代器

参数

结果

例子

count()

start, [step]

start, start+step, start+2*step, …

count(10) --> 10 11 12 13 14...

cycle()

p

p0, p1, … plast, p0, p1, …

cycle('ABCD') --> C...

repeat()

elem [,n]

elem, elem, elem, … endlessly or up to n times

repeat(10, 3) --> 10 10 10

有限序列迭代器:

迭代器

参数

结果

例子

accumulate()

p [,func]

p0, p0+p1, p0+p1+p2, …

accumulate([1,2,3,4,5]) --> 610 15

chain()

p, q, …

p0, p1, … plast, q0, q1, …

chain('ABC', 'DEF') --> EF

chain.from_iterable()

iterable

p0, p1, … plast, q0, q1, …

chain.from_iterable(['ABC','DEF']) --> F

compress()

data, selectors

(d[0] if s[0]), (d[1] if s[1]), …

compress('ABCDEF', [1,0,1,0,1,1])--> F

dropwhile()

pred, seq

seq[n], seq[n+1], starting when pred fails

dropwhile(lambda x: x<5,[1,4,6,4,1]) --> 1

filterfalse()

pred, seq

elements of seq where pred(elem) is false

filterfalse(lambda x: x%2,range(10)) --> 8

groupby()

iterable[, key]

sub-iterators grouped by value of key(v)

 

islice()

seq, [start,] stop [, step]

elements from seq[start:stop:step]

islice('ABCDEFG', 2, None) --> CG

starmap()

func, seq

func(*seq[0]), func(*seq[1]), …

starmap(pow, [(2,5), (3,2),(10,3)]) --> 32 1000

takewhile()

pred, seq

seq[0], seq[1], until pred fails

takewhile(lambda x: x<5,[1,4,6,4,1]) --> 4

tee()

it, n

it1, it2, … itn splits one iterator into n

 

zip_longest()

p, q, …

(p[0], q[0]), (p[1], q[1]), …

zip_longest('ABCD', 'xy',fillvalue='-') --> Ax By C- D-

排列组合迭代器:

Iterator

Arguments

Results

product()

p, q, … [repeat=1]

cartesian product, equivalent to a nested for-loop

permutations()

p[, r]

r-length tuples, all possible orderings, no repeated elements

combinations()

p, r

r-length tuples, in sorted order, no repeated elements

combinations_with_replacement()

p, r

r-length tuples, in sorted order, with repeated elements

product('ABCD', repeat=2)

 

AA AB AC AD BA BB BC BD CA CB CC CD DA DB DCDD

permutations('ABCD', 2)

 

AB AC AD BA BC BD CA CB CD DA DB DC

combinations('ABCD', 2)

 

AB AC AD BC BD CD

combinations_with_replacement('ABCD',2)

 

AA AB AC AD BB BC BD CC CD DD

 

 


 

 

三、模块函数详细说明与使用

 

1、计数、几步

  itertools.count(start=0, step=1)

  • start:计数起始值。
  • step:计数间隔。

 

  说明:生成一个迭代器,该迭代器从start开始迭代,第i次迭代返回start+i*step。

 

代码示例:

import itertools

#输出0-9的奇数
for i in itertools.count(1,2):
    print(i)
    if i==9 :
        break
        
'''
结果:
1
3
5
7
9
'''

 

 

2、无限循环(往复)迭代

  itertools.cycle(iterable)

  • iterable:可迭代对象。

 

  说明: 把iterable变成无限循环迭代的迭代器,让iter不再只能迭代一轮。

 

代码示例:

import itertools

j=0

#循环输出'abc'中的字母
for i in itertools.cycle('abc'):
    print(i)
    
    #第5步结束循环
    j+=1    
    if j==5 :
        break

'''
结果:
a
b
c
a
b
'''

 

 

3、重复

  itertools.repeat(object,times=None)

  • object:一个对象用于重复。
  • times:重复次数。

 

  说明: 生成一个重复times次object的迭代器,若times=None则无限次重复。

 

代码示例:

import itertools

for i in itertools.repeat('练习',3):
    print(i)


'''
结果:
练习
练习
练习
'''

 

 

4、迭代器拼接

  itertools.chain(*iterables)

  • *iterables:可以传入多个迭代器作为参数。

 

  说明: 把传入的多个iterable拼接成一个迭代器,并且按传入顺序迭代。

 

  itertools.chain.from_iterable(iterable)

  • iterable:可迭代对象。

   

  说明: 将iterable的元素进行拼接后生成迭代器,按iterable元素迭代顺序进行拼接,iterable的元素必须是可迭代的,例如含有可迭代对象的列表['abc',[1,2,3]]。

 

代码示例:

import itertools

print('单独的迭代器拼接')
for i in itertools.chain('abc',[1,2,3]):
    print(i)

print('用iterable的元素拼接,iterable的元素必须为可迭代:')
for i in itertools.chain.from_iterable(['abc',[1,2,3]]):
    print(i)

'''
结果:
单独的迭代器拼接
a
b
c
1
2
3
用该列表的元素拼接,列表元素必须为可迭代器:
a
b
c
1
2
3
'''

 

 

5、数据选择、筛选

  itertools.compress(data,selector)

  • data:一个可以用来迭代的数据。
  • selector:选择器,用来对data进行筛选。

 

  说明: 生成一个筛选之后的迭代器,筛选规则为,当selector的第i个值为真,则保留data的第i个值,否则去除data的第i个值,类似于numpy.where(),但是不要求selector于data有相同的迭代长度。

 

代码示例:

import itertools

#data长度为5,selector长度为3
for i in itertools.compress([1,2,3,4,5,6],[1,0,1]):
    print(i)


'''
结果:
1
3
'''

 

 

 6、数据剔除

  dropwhile(predicate, iterable)

  • predicate:一个判断函数,该函数返回值类型为bool。
  • iterable:可迭代对象。

 

  说明:将iterable中的元素传入predicate中作为predicate的参数,若predicate返回True则去除,若predicate返回Flase则保留,最后生成一个迭代器。

 

代码示例:

import itertools

#去除小于3的数
for i in itertools.dropwhile(lambda x:x<3,[1,2,3,4,5]):
    print(i)


'''
结果:
3
4
5
'''

 

 

7、相邻数据分组

  groupby(iterable, key=None)

  • iterable:可迭代对象。
  • key:一个函数,将iterable的元素传入作为参数。

 

  说明:把迭代器中相邻的重复元素挑出来放在一起,挑选规则是通过key函数完成的,只要作用于函数的两个元素返回的值相等,这两个元素就被认为是在一组的,而函数返回值作为组的key。如果我们要忽略大小写分组,就可以让元素'A''a'都返回相同的key。groupby是一个迭代器类,每次迭代有两个返回值,一个是key函数的返回值,一个是临近的同组元素的迭代器。

 

代码示例:

import itertools

#将字符串元素转换为大写后,相邻字符相同的组成一组
for i,j in itertools.groupby('AaBbA',lambda x:x.upper()):   #i是lambda匿名函数返回的结果,j是函数处理之后的同组元素迭代器
    print('%s:%s'%(i,list(j)))

'''
结果:
A:['A', 'a']
B:['B', 'b']
A:['A']
'''

 

 

8、数据过滤

  filterflase(predicate, iterable)

  • predicate:断言,一个判断函数,该函数返回值类型为bool。
  • iterable:可迭代对象。

 

  说明:将iterable的元素不满足predicate的元素去除过滤之后生成一个迭代器。

 

代码示例:

import itertools

#生成迭代器,其元素不包含原序列小于3的数据
for i in itertools.filterfalse(lambda x:x<3,[1,2,3,4,5]):
    print(i)

'''
结果:
3
4
5
'''

 

 

9、数据切片

  islice(iterable, start, stop[, step])

  • iterable:可迭代对象。
  • start:起始索引。
  • stop:结束索引。
  • step:间隔。

 

  说明:对iterable进行切片,参考函数slice。

 

代码示例:

import itertools

#生成迭代器,其元素不包含原序列小于3的数据
for i in itertools.islice([0,1,2,3,4,5],2,4,2):
    print(i)

'''
结果:
3
4
5
'''

 

 

10、数据映射

  startmap(func,iterable)

  • func:函数,用来对iterable的每个元素进行操作。
  • iterable:可迭代对象。

 

  说明:对iterable进行映射操作,参考map函数。两者区别在于func有多个参数时,startmap为func(*arg)用的是可变参数,map为func(arg1,arg2)用的是位置参数

 

代码示例:

import itertools

#生成迭代器,其元素为原来元素之和的映射
for i in itertools.starmap(lambda x,y:x+y,[(1,1),(2,2),(3,3)]):
    print(i)

'''
结果:
2
4
6
'''

 

 

11、迭代器复制

  tee(iterable,n=2)

  • iterable:可迭代对象。
  • n:要复制的个数。

 

  说明:对iterable进行复制,生成n的相同的iterable。

 

代码示例:

import itertools

#复制迭代器
i,j,k=itertools.tee(iter('abc'),3)
print(list(i))
print(list(j))
print(list(k))

'''
结果:
['a', 'b', 'c']
['a', 'b', 'c']
['a', 'b', 'c']
'''

 

 

12、数据选取

  takewhile(predicate, iterable)

  • predicate:要复制的个数。
  • iterable:可迭代对象。

 

  说明:将iterable中的元素提取出来生,直到不满足predicate就结束,类似于while循环。

 

代码示例:

import itertools

#复制迭代器
for i in itertools.takewhile(lambda x:x<3,[1,2,3,4,3,2,1]):
    print(i)

'''
结果:
1
2
'''

 

 

13、数据连接

  izip_longest(*iterables, fillvalue=None)

  • *iterables:需要连接的可迭代器。
  • fillvalue:当连接的内容为空时的填充值,如:x=[1,2],y=[1],fillvalue=‘-’,list(izip_longest(x,y,'-'))则返回结果为[(1,1),(2,-)]。

 

  说明:将多个iterable的元素按顺序用元组的形式连接,类似zip。

 

代码示例:

import itertools

#复制迭代器
for i,j in itertools.zip_longest('abc','12',fillvalue='nan'):
    print(i,j)

'''
结果:
a 1
b 2
c nan
'''

 

 

 

13、数据笛卡尔积

  product(*iterables,repeat)

  • *iterables:需要笛卡尔积运算的可迭代器。
  • repeat:将所有iterable重复repeat个之后再进行笛卡尔积,默认不重复。

 

  说明:将多个iterable的元素进行笛卡尔积。

 

代码示例:

 

import itertools

print('不重复:')
for i in itertools.product('ab','12'):
    print(i)

print('重复2次:')
for i in itertools.product('ab',repeat=2):
    print(i)

'''
结果:
不重复:
('a', '1')
('a', '2')
('b', '1')
('b', '2')
重复2次:
('a', 'a')
('a', 'b')
('b', 'a')
('b', 'b')
'''

 

 

14、元素的组合

  itertools.combinations(iterable, r)

  • iterable:一个可迭代对象。
  • r:取tierable对象中r个元素进行组合。

 

  说明:生成一个迭代器,该迭代器将tierable的r个元素进行所有可能的组合,每次迭代只返回一个组合,迭代器可以用list()转换成列表。

 

代码示例:

import itertools

x=[1,2,3]

combin_1=itertools.combinations(x,1)    #取1个数进行组合,生成的时一个迭代器
combin_2=itertools.combinations(x,2)    #取2个数进行组合,生成的是一个迭代器

print('combin_1:',list(combin_1))   #将迭代器转为列表并打印

print('\ncombin_1、combin_2的数据类型:',type(combin_1))

print('\n输出迭代器每次迭代内容:')
for i in combin_2:
    print(i)



'''
结果:

combin_1: [(1,), (2,), (3,)]

combin_1、combin_2的数据类型: <class 'itertools.combinations'>

输出迭代器每次迭代内容:
(1, 2)
(1, 3)
(2, 3)

'''

 

15、数据的排列

  itertools.combinations(iterable, r)

  • iterable:一个可迭代对象。
  • r:取tierable对象中r个元素进行组合。

 

  说明:生成一个迭代器,该迭代器将tierable的r个元素进行所有可能的排列,每次迭代只返回一个排列。

 

代码示例:

import itertools

x=[1,2,3]

combin_1=itertools.permutations(x,1)    #取1个数进行组合,生成的时一个迭代器
combin_2=itertools.permutations(x,2)    #取2个数进行组合,生成的是一个迭代器

print('combin_1:',list(combin_1))   #将迭代器转为列表并打印

print('\ncombin_1、combin_2的数据类型:',type(combin_1))

print('\n输出迭代器每次迭代内容:')
for i in combin_2:
    print(i)


'''
结果:

combin_1: [(1,), (2,), (3,)]

combin_1、combin_2的数据类型: <class 'itertools.permutations'>

输出迭代器每次迭代内容:
(1, 2)
(1, 3)
(2, 1)
(2, 3)
(3, 1)
(3, 2)

'''

推荐阅读