1. 程式人生 > >Python標準庫(3.x): itertools庫掃盲

Python標準庫(3.x): itertools庫掃盲

有一個 參數 ron repl gpo 位置 AC zip() drop

itertools functions
accumulate() compress() groupby() starmap()
chain() count() islice() takewhile()
chain.from_iterable() cycle() permutations() tee()
combinations() dropwhile() product() zip_longest()
combinations_with_replacement() filterfalse() repeat()

itertools.accumulate(iterable [, func]
)

  返回一個叠代序列的累加值序列(沒有func的情況下)。

  當指定了func(參數必須為兩個)後,將通過func進行累加。

  註1: 當沒有傳入func時,func相當於 operator.add

  註2: 返回值為叠代器

>>> data = [1,2,3,4]
>>> a = itertools.accumulate(data)
>>> list(a)
[1, 3, 6, 10]
#[1,2,3,4] --> [1, 1+2, (1+2)+3, ((1+2)+3)+4]

>>> b = itertools.accumulate(data, operator.mul)
>>> list(b) [1, 2, 6, 24] #[1,2,3,4] --> [1, 1*2, (1*2)*3, ((1*2)*3)*4]

itertools.chain(*iterables)

  連接多個叠代序列為一個叠代序列,適用於需要連續遍歷多個序列場景。

  註`: 返回值為叠代器

>>> a = [1,2,3,4,5]
>>> b = [6,7,8,9,10]
>>> c = itertools.chain(a,b)
>>> list(c)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

itertools.chain.from_iterable(iterable)

  通過一個叠代序列來創建 itertools.chain 的對象。

  類似於將叠代序列中的每一個對象作為 itertools.chain 的參數,因此傳入的叠代序列中的每一個對象應該也是可叠代的。

  註1: 返回值為叠代器

>>> a = itertools.chain.from_iterable([abc, def, hjk])
>>> list(a)
[a, b, c, d, e, f, h, j, k]
>>>
>>> b = itertools.chain.from_iterable([1,2,3])
>>> list(b)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: int object is not iterable

itertools.combinations(iterable, r)

  將叠代序列中的對象進行"不重復的"組合並返回所有組合的元組列表,每個組合的元素個數為r

  註1: 這裏的“不重復”是指叠代序列中的對象不會使用多次,但並不代表相同的值不會使用多次。

  註2: 返回的組合順序依賴傳入的叠代序列中的順序。

  註3: 返回值為叠代器。

>>> a = itertools.combinations(ABC,2)
>>> list(a)
[(A, B), (A, C), (B, C)]
>>>
>>> b = itertools.combinations(CBA,2)
>>> list(b)
[(C, B), (C, A), (B, A)]
>>>
>>> c = itertools.combinations(AAC,2)
>>> list(c)
[(A, A), (A, C), (A, C)]

itertools.combinations_with_replacement(iterable, r)

  將叠代序列中的對象進行"可重復的"組合並返回所有組合的元組列表,每個組合的元素個數為r

  註1: itertools.combinations 的唯一區別就是元素可以重復使用。

  註2: 返回的組合順序依賴傳入的叠代序列中的順序。

  註3: 返回值為叠代器

>>> a = itertools.combinations_with_replacement(ABC, 2)
>>> list(a)
[(A, A), (A, B), (A, C), (B, B), (B, C), (C, C)]

itertools.compress(data, selectors)

  對 data 中的數據進行過濾,只保留 selectors 中對應位置為 True 的對象。

  dataselectors的序列長度可以不等,其中任意一個叠代終結,整個叠代即終結。

  註1: 返回值為叠代器

>>> a = itertools.compress(ABCDE, [1,1,0,0,0])
>>> list(a)
[A, B]
>>>
>>> b = itertools.compress(ABCDE, [1,1])
>>> list(b)
[A, B]
>>>
>>> c = itertools.compress(ABC, [1,1,0,0,1])
>>> list(c)
[A, B]

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

  生成一個計數叠代器,可以指定起始點和步進,但是沒有終點,可以一直叠代下去。

  一般需要配合其他的叠代器一起使用,例如作為map(), zip()的參數等。

>>> a = itertools.count(start=1, step=2)
>>> next(a)
1
>>> next(a)
3
>>> next(a)
5
>>> next(a)
7
>>> next(a)
9
>>> next(a)
11
>>> next(a)
13
>>> 
>>> b = itertools.count(start=100, step=1)
>>> list(zip(b, ABCDE))
[(100, A), (101, B), (102, C), (103, D), (104, E)]

itertools.cycle(iterable)

  生成一個循環叠代器,循環遍歷傳入叠代器中的對象,沒有終結。

  一般需要配合其他叠代器一起使用,例如map(), zip() 的參數等

>>> a = itertools.cycle(ABC)
>>> next(a)
A
>>> next(a)
B
>>> next(a)
C
>>> next(a)
A
>>> next(a)
B
>>> next(a)
C
>>> next(a)
A
>>> 
>>> b = itertools.cycle(range(1,4))
>>> list(zip(ABCDEFG, b))
[(A, 1), (B, 2), (C, 3), (D, 1), (E, 2), (F, 3), (G, 1)]

itertools.dropwhile(predicate, iterable)

  對叠代器中的對象按照 predicate 進行斷言,丟棄第一個斷言為False之前的所有對象。

  也可以理解為從第一個斷言為False的對象開始輸出。

  註1: 當出現第一個斷言為False的對象後,之後的對象不再進行斷言。

  註2: predicate 代表的函數只能有一個參數。

  註3: 返回值為叠代器

>>> a = itertools.dropwhile(lambda x: x<5, [3,4,5,6,5,4,3])
>>> list(a)
[5, 6, 5, 4, 3]

itertools.filterfalse(predicate, iterable)

  過濾掉叠代器中按照 predicate 斷言為 True 的對象。

  如果 predicate 傳入None, 則過濾掉值為 True 的對象。

  註1: 返回值為叠代器

>>> a = itertools.filterfalse(lambda x: x%2==0, range(10))
>>> list(a)
[1, 3, 5, 7, 9]
>>> 
>>> b = itertools.filterfalse(None, [1,0,1,0,1,0])
>>> list(b)
[0, 0, 0]

itertools.groupby(iterable, key=None)

  對叠代序列中的對象按照key進行分組,如果key為None則按照對象本身的值進行分組。

  註1: 如果叠代序列中key值相等的對象中間間隔了其他的key值,則不會分在一個組。

  註2: 返回值為一個叠代器且返回的是一個有兩個元素的元組,第一個元素為key值,第二個元素為分組對象的叠代器

>>> data = [abc-0, def-0, xyz-1, tty-1, kkk-2]
>>> a = itertools.groupby(data, lambda x:x[-1])
>>> [(k, list(g)) for k, g in a]
[(0, [abc-0, def-0]), (1, [xyz-1, tty-1]), (2, [kkk-2])]
>>> 
>>> 
>>> b = itertools.groupby(AAABBBCC)
>>> [(k, list(g)) for k, g in b]
[(A, [A, A, A]), (B, [B, B, B]), (C, [C, C])]

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

  對叠代序列進行分片,類似 slice(),但是本函數中 start, stop, step 都不能為負數。

  參數 start 如果為 None, 則 start = 0

  參數 stop 如果為 None, 則叠代到最後一個

  參數 step 如果為 None, 則 step = 1

  註1: 返回值為一個叠代器

>>> data = ABCDEFG
>>> a = itertools.islice(data, 3)
>>> list(a)
[A, B, C]
>>> 
>>> b = itertools.islice(data, 1, 5, 2)
>>> list(b)
[B, D]
>>> 
>>> c = itertools.islice(data, None, 3)
>>> list(c)
[A, B, C]
>>> 
>>> d = itertools.islice(data, 3, None)
>>> list(d)
[D, E, F, G]

itertools.permutations(iterable, r=None)

  將叠代序列中的對象進行"不重復的"排列組合並返回所有組合的元組列表,每個組合的元素個數為r

  如果rNone,則長度為叠代序列的長度。

  註1: 這裏的“不重復”是指叠代序列中的對象不會使用多次,但並不代表相同的值不會使用多次。

  註2: 返回的組合順序依賴傳入的叠代序列中的順序。

  註3: 返回值為叠代器。

>>> a = itertools.permutations(ABC, 2)
>>> list(a)
[(A, B), (A, C), (B, A), (B, C), (C, A), (C, B)]
>>> 
>>> b = itertools.permutations(ABC)
>>> list(b)
[(A, B, C), (A, C, B), (B, A, C), (B, C, A), (C, A, B), (C, B, A)]

itertools.product(*iterables, repeat=1)

  返回多個叠代序列的笛卡爾乘積,repeat值相當於把傳入的叠代器參數重復的次數。

  註1: 返回值是一個叠代器

>>> a = itertools.product(ABCD, xy)
>>> list(a)
[(A, x), (A, y), (B, x), (B, y), (C, x), (C, y), (D, x), (D, y)]
>>> 
>>> b = itertools.product(range(2), repeat=3)
>>> list(b)
[(0, 0, 0), (0, 0, 1), (0, 1, 0), (0, 1, 1), (1, 0, 0), (1, 0, 1), (1, 1, 0), (1, 1, 1)]
# 相當於 itertools.product(range(2), range(2), range(2))

itertools.repeat(object [, times])

  返回一個叠代器,重復傳入的對象。重復的次數為 times 。

  如果沒有傳入times參數,則無限重復。

>>> a = itertools.repeat(hello, 3)
>>> list(a)
[hello, hello, hello]
>>> 
>>> b = itertools.repeat(test)
>>> list(map(lambda x, y: x + y, b, ABCD))
[testA, testB, testC, testD]

itertools.starmap(function, iterable)

  和 map() 類似。但是這裏 function 的參數封裝在叠代器中的每一個對象中。

  註1: 叠代器中的每一個對象也必須是可叠代的,哪怕函數只有一個參數。

>>> a = itertools.starmap(lambda x,y: x**y, [(2,1), (2,2), (2,3)])
>>> list(a)
[2, 4, 8]
>>> 
>>> b = itertools.starmap(lambda x: x*x, [(1,),(2,),(3,)])
>>> list(b)
[1, 4, 9]

itertools.takewhile(predicate, iterable)

  與 dropwhile() 相反,對叠代器中的對象按照 predicate 進行斷言,輸出第一個斷言為False之前的所有對象。

  註1: 當出現第一個斷言為False的對象後,叠代即終止。

  註2: predicate 代表的函數只能有一個參數。

  註3: 返回值為叠代器

>>> a = itertools.takewhile(lambda x: x<5, [3,4,5,6,5,4,3])
>>> list(a)
[3, 4]

itertools.tee(iterable, n=2)

  將一個叠代器復制n次,返回一個有n個叠代器的元組。n默認為2

>>> a = itertools.tee(ABC)
>>> [list(x) for x in a]
[[A, B, C], [A, B, C]]
>>> 
>>> b = itertools.tee(range(5), 3)
>>> [list(x) for x in b]
[[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4]]

itertools.zip_longest(*iterables, fillvalue=None)

  類似於 zip()。但是這裏按照最長的叠代序列進行打包,缺少的元素用 fillvalue 的值進行填充。

  註1: fillvalue 默認為None, 並且如果是None,填充的就是None

>>> a = itertools.zip_longest(ABC, xy, fillvalue=*)
>>> list(a)
[(A, x), (B, y), (C, *)]
>>>
>>> b = itertools.zip_longest(ABC, xy)
>>> list(b)
[(A, x), (B, y), (C, None)]

Python標準庫(3.x): itertools庫掃盲