itertools模組的使用

2021-10-09 23:24:30 字數 4457 閱讀 7225

#打破順序,可能出現的所有情況,可能同乙個元祖中順序不同的情況下,元素相同

permutations()是排列函式

所有元素重排列為所有可能的情況(將元素之間的順序打亂成所有可能的情況),以元祖的形式返回。

案例1:

import itertools

a = [1,2,3]

n = 0

for i in itertools.permutations(a):

print(i)

n += 1

print(n)

輸出為:(在每個元祖不重複的情況下,可能出現的所有情況)

(1, 2, 3)

(1, 3, 2)

(2, 1, 3)

(2, 3, 1)

(3, 1, 2)

(3, 2, 1)

6案例2:

import itertools

a = [1,2,3]

n = 0

for i in itertools.permutations(a,2):

print(i)

n += 1

print(n)

輸出為:(後面還有乙個引數,可以指定組成的元素是多少個)

(1, 2)

(1, 3)

(2, 1)

(2, 3)

(3, 1)

(3, 2)

6

組合函式

#突破了長度限制,每個元祖中資料不可相同的所有組成方式

combinations()是組合函式

對combinations來說, 元素之間的實際順序是不予考慮的.也就是說組合('a', 'b')和組合('b', 'a')被認為是相同的組合形式

例項:import itertools

a = [1,2,3]

n = 0

for i in itertools.combinations(a,2):

print(i)

n += 1

print(n)

輸出為:(可以認為(1,2)和(2,1)為相同的)

(1, 2)

(1, 3)

(2, 3)

3 combinations_with_replacement()也是組合函式

解除了combinations()中的限制, 允許相同的元素得到多次選擇.允許超出元素個數限制

例項:import itertools

a = [1,2]

n = 0

for i in itertools.combinations_with_replacement(a,3): #後面這個引數可以改,突破了最大限度

print(i)

n += 1

print(f'最多組合數:')

輸出為:

(1, 1, 1)

(1, 1, 2)

(1, 2, 2)

(2, 2, 2)

最多組合數:4

組合迭代器

組合操作包括排列,笛卡兒積,或者一些離散元素的選擇,組合迭代器就是產生這樣序列的迭代器。我們來看看這幾個函式的用法。

product(*iterables, repeat=1) 得到的是可迭代物件的笛卡兒積,*iterables引數表示需要多個可迭

代物件。這些可迭代物件之間的笛卡兒積

例項:import itertools

a = ['a','b','c']

b = [1,2,3]

for i in itertools.product(a,b,repeat=1): #repeat為關鍵字引數,預設為1

print(i)

輸出為:

('a', 1)

('a', 2)

('a', 3)

('b', 1)

('b', 2)

('b', 3)

('c', 1)

('c', 2)

('c', 3)

其他函式

itertools包自帶了三個可以無限迭代的迭代器。這意味著,當你使用他們時,你要知道要的到底是最終會

停止的迭代器,還是需要無限地迭代下去

count() #可以理解為無限制的容器

count(初值=0, 步長=1):count 迭代器會返回從傳入的起始引數開始的均勻間隔的數值。count 也可以

接收指定的步長引數。

例項1:

import itertools

from time import sleep

for i in itertools.count(): #預設從0開始,步長為1,在沒有指定特定情況下,無線迭代下去.

print(i)

輸出為:01

23...例項2:

import itertools

from time import sleep

for i in itertools.count(10,2): #如果指定了起始引數,那就從起始引數開始,步長為第二個引數

print(i) # if i == 20:

輸出為: break #可以新增特定引數.跳出迴圈

1012

1416

18...

islice(可迭代物件, 迭代次數):從可迭代物件開始,輸出 迭代次數個元素後結束。islice 的第二個

引數控制何時停止迭代。但其含義並不是」達到數字 n時停止「,而是」當迭代了 n次之後停止「。

例項:import itertools

my_list = [1,2,3,4,5,6,7,8,9,10]

for i in itertools.islice(my_list,3): #迭代物件可以是count(n)

print(i) # for i in itertools.islice(count(10),5)

# print(i) #從10開始,迭代5次

輸出為:12

3 (迭代3次,結束)

cycle:這裡我們建立了乙個 for 迴圈,使其123無限迴圈

(使可迭代物件無線迭代下去,迭代完一次後,從頭開始繼續迭代)

例項:import itertools

my_list = [1,2,3]

for i in itertools.cycle(my_list): #可迭代物件,迭代完成後繼續從頭開始迭代

print(i) #當然可以加計數器來終止迭代

可終止迭代器

accumulate(可迭代物件[, 函式])  #(預設說白了就是累加)

accumulate 迭代器將返回累計求和結果,或者傳入兩個引數的話,由傳入的函式累積計算的結果。預設

設定為相加,我們趕快試一試吧:

例項1:

import itertools

my_list = [i for i in range(0,10)]

i = itertools.accumulate(my_list) #相當於0+1+2+3+4+5+6+7+8+9

print(my_list)

print(list(i))

輸出為:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

[0, 1, 3, 6, 10, 15, 21, 28, 36, 45]

例項2:(實現了階乘)

import itertools

import operator

def mul(a,b):

return a * b

my_list = [i for i in range(1,10)]

i = itertools.accumulate(my_list,mul) #operator.mul也實現了相乘的方法

print(1*2*3*4*5*6*7*8*9)

print(list(i))

輸出為:

362880

[1, 2, 6, 24, 120, 720, 5040, 40320, 362880]

chain()

直白點說就是兩個可迭代物件合併為乙個

例項:

import itertools

a = [i for i in range(1,11)]

b = ['a','b','c']

print(a + b)

print(list(itertools.chain(a,b))) #這種方法更為優雅

輸出為:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 'a', 'b', 'c']

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 'a', 'b', 'c']

迭代的模組itertools

itertools模組提供的全部是處理迭代功能的函式,他們的返回值不是list,而是迭代物件,只有在for迴圈的時候才會真正去計算。使用迭代器的好處是在迴圈的時候才去取值,而直接返回值為list的結果會占用大量的記憶體,從而使用迭代器的話,使用了惰計算的方式,或者是延遲計算,從而在效能上能好很多。在...

itertools模組的用法

itertools模組是python的乙個內建模組,它提供了非常有用的用於操作迭代物件的函式。x itertools.cycle 123 for i in x print i 輸出結果 1 2 3 1 2 import itertools natuals itertools.count 1 for ...

內建模組 itertools

python的內建模組itertools提供了非常有用的用於操作迭代物件的函式。首先,我們看看itertools提供的幾個 無限 迭代器 import itertools natuals itertools.count 1 for n in natuals print n 123 因為count 會...