1. 程式人生 > >花式迭代器:Python3.7的itertools模組

花式迭代器:Python3.7的itertools模組

迭代器模組:itertools

作者:Shawn
python3.7
文件:
https://docs.python.org/3/library/itertools.html
重寫基於https://blog.csdn.net/weixin_41084236/article/details/81179704

  • itertools中有許多有意思的功能,使用得當可以節約大量生命。

無限迭代器

count()

itertools.count(start=0,step=1)
  • 返回以start為開頭,步長step的值。
>>> for i in
itertools.count(): print(i) 0 1 2 3 4 ...

cycle():復讀機一號

itertools.cycle(iterable)
  • 儲存物件的副本,並無限重複返回每一個元素。
>>> for i in itertools.cycle([2,3,4,5]):
    print(i)

2
3
4
5
2
3
4
5
2
...

repeat():復讀機二號

itertools.repeat(object[,times])
  • 重複返回物件[次]。
>>> for i in itertools.repeat('雪碧'):
    print(i)

雪碧
雪碧
雪碧
雪碧
雪碧
...

終止於最短輸入的迭代器

accumulate()

itertools.accumulate(iterable[, func])
  • 對iterable物件內的每個元素依次做func運算,更新並輸出。
  • func要求為二目運算,詳見operator模組
>>> for i in itertools.accumulate([1,2,3,4],operator.add):
    print(i)


1
3
6
10
>>> for i in itertools.accumulate([1,2,3,4],operator.mul):
    print(i)


1
2
6
24

chain()

itertools.chain(*iterables)
  • 將所有輸入拼接輸出。
>>> a='把你的心'
>>> b=' 我的心'
>>> c=' 串一串'
>>> for i in itertools.chain(a,b,c):
    print(i)


把
你
的
心

我
的
心

串
一
串

chain.from_iterable()

chain.from_iterable(iterable)
  • 將單個iterable中的所有元素拼接輸出。
>>> d=['串一株幸運草',' 串一個同心圓']
>>> for i in itertools.chain.from_iterable(d):
    print(i)


串
一
株
幸
運
草

串
一
個
同
心
圓

compress()

itertools.compress(data,selectors)
  • 返回data中對應selectors為True的元素。
  • 相當於把selectors當做濾鏡套在了data上。
>>> selec=[True,False,42,0,-42,'shuang']
>>> items=['mole','xiangxiangji','tazhenmei','wodene','migang','shuangsile']
>>> for i in itertools.compress(items,selec):
    print(i)

mole
tazhenmei
migang
shuangsile

dropwhile()

itertools.dropwhile(predicate, iterable)
  • 從頭開始,幹掉不符合的元素,直到第一個正確元素。
>>> for i in itertools.dropwhile(lambda x:x<7,[1,2,3,6,7,8,2,4,5,9]):
    print(i)


7
8
2
4
5
9

filterfalse()

itertools.filterfalse(predicate, iterable)
  • 輸出為錯的要素:
>>> for i in itertools.filterfalse(lambda x:x=='moyu',['moyu','jinye']):
    print(i)
jinye

groupby()

itertools.groupby(iterable, key=None)
  • 將iterable同要素聚合輸出:
>>> for k,g in itertools.groupby('aaAAaBBBCCCCC'):
    print(k)
    print(list(g))


a
['a', 'a']
A
['A', 'A']
a
['a']
B
['B', 'B', 'B']
C
['C', 'C', 'C', 'C', 'C']

islice()

itertools.islice(iterable, stop)
itertools.islice(iterable, start, stop[, step])
  • 切片操作的迭代器版本
>>> for i in itertools.islice('fengliutitangShawn',0,None,2):
    print(i)


f
n
l
u
i
a
g
h
w

starmap()

itertools.starmap(function, iterable)
  • map的迭代器版本
>>> for i in itertools.starmap(operator.add,[(1,2),(3,4),(5,6)]):
    print(i)


3
7
11

takewhile()

itertools.takewhile(predicate, iterable)
  • 與filterfalse()的判斷條件相反。
>>> for i in itertools.takewhile(lambda x:x=='moyu',['moyu','jinye']):
    print(i)


moyu

tee()

itertools.tee(iterable, n=2)
  • 建立n個與iterable相同的獨立迭代器。
>>> for i in itertools.tee([1,2,3,4,5,6]):
    for j in i:
        print(j)


1
2
3
4
5
6
1
2
3
4
5
6

zip_longest()

itertools.zip_longest(*iterables[,fillvalue=none])
  • 用最長序列來zip,短序列填充fillvalue
>>> for i in itertools.zip_longest('Twilight Sparkle','Rainbow Dash','Fluttershy','Apple Bloom',fillvalue='Biu'):
    print(i)


('T', 'R', 'F', 'A')
('w', 'a', 'l', 'p')
('i', 'i', 'u', 'p')
('l', 'n', 't', 'l')
('i', 'b', 't', 'e')
('g', 'o', 'e', ' ')
('h', 'w', 'r', 'B')
('t', ' ', 's', 'l')
(' ', 'D', 'h', 'o')
('S', 'a', 'y', 'o')
('p', 's', 'Biu', 'm')
('a', 'h', 'Biu', 'Biu')
('r', 'Biu', 'Biu', 'Biu')
('k', 'Biu', 'Biu', 'Biu')
('l', 'Biu', 'Biu', 'Biu')
('e', 'Biu', 'Biu', 'Biu')

組合生成器

product()

itertools.product(*iterables[,repeat=1])
  • 對*iterables進行笛卡爾積運算。
>>> for i in itertools.product('Tom','Jerry',repeat=1):
    print(i)

('T', 'J')
('T', 'e')
('T', 'r')
('T', 'r')
('T', 'y')
('o', 'J')
('o', 'e')
('o', 'r')
('o', 'r')
('o', 'y')
('m', 'J')
('m', 'e')
('m', 'r')
('m', 'r')
('m', 'y')

permutations()

itertools.permutations(iterable[,r])
  • 返回連續長度為r(預設為最大長度)的迭代物件。
import itertools

digi=[1,2,3]
for item in itertools.permutations(digi,2):
    print(item)
for item in itertools.permutations(range(3)):
    print(item)

(1, 2)
(1, 3)
(2, 1)
(2, 3)
(3, 1)
(3, 2)
(0, 1, 2)
(0, 2, 1)
(1, 0, 2)
(1, 2, 0)
(2, 0, 1)
(2, 1, 0)

combinations()和combinations_with_replacement()

itertools.combinations(iterable, r)
itertools.combinations_with_replacement(iterable, r)
  • combinataions與permutations類似,但由前到後返回不重複(索引組合)的迭代。
  • combinations_with_replacement與combinataions類似,但是將自身索引也作為一次物件。
import itertools

digi=[1,2,3]
for item in itertools.combinations(digi,2):
    print(item)
print ("\n")
for item in itertools.combinations(range(3),2):
    print (item)

(1, 2)
(1, 3)
(2, 3)

(0, 1)
(0, 2)
(1, 2)

import itertools

digi=[1,2,3]
for item in itertools.combinations_with_replacement(digi,2):
    print(item)

(1, 1)
(1, 2)
(1, 3)
(2, 2)
(2, 3)
(3, 3)