python之itertools模塊


一、介紹

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM