#打破順序,可能出現的所有情況,可能同乙個元祖中順序不同的情況下,元素相同
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 會...