天天看點

itertools之排列組合疊代器(Combinatoric Iterators)

一、itertools.product

文法:*itertools.product(iterables, repeat=1)

注解:

Cartesian product of input iterables.

Roughly equivalent to nested for-loops in a generator expression. For example, product(A, B) returns the same as ((x,y) for x in A for y in B).

個人了解:顧名思義,product是乘積的意思,而它是以笛卡爾乘積的形式去組合多個iterable對象裡面的元素,并以元組的形式輸出。如果你想用單個的iterable對象對它自身求取笛卡爾積的組合,那麼你可以通過參數repeat去指定使用幾個相同的iterable對象求笛卡爾積組合。

舉個例子:

for i in itertools.product('ABC', 'xy'):
	print(i)
	time.sleep(0.5)

# 輸出結果:  
('A', 'x')
('A', 'y')
('B', 'x')
('B', 'y')
('C', 'x')
('C', 'y')

# 如果将第一行代碼改為:for i in itertools.product('AB', repeat=3)那麼輸出的結果為:  
('A', 'A', 'A')
('A', 'A', 'B')
('A', 'B', 'A')
('A', 'B', 'B')
('B', 'A', 'A')
('B', 'A', 'B')
('B', 'B', 'A')
('B', 'B', 'B')  
           

二、itertools.permutations

文法:itertools.permutations(iterable, r=None)

注解:

Return successive r length permutations of elements in the iterable.

If r is not specified or is None, then r defaults to the length of the iterable and all possible full-length permutations are generated.

個人了解:這個方法能将傳入的iterable對象裡面的元素以r的長度進行排列組合,特點是,每個元素不會與自身進行排列組合。

舉個例子:

for i in itertools.permutations('ABC', 2):
	print(i)
	time.sleep(0.5)  

# 輸出結果為:  
('A', 'B')
('A', 'C')
('B', 'A')
('B', 'C')
('C', 'A')
('C', 'B')
           

三、itertools.combinations

文法:itertools.combinations(iterable, r)

注解:

Return r length subsequences of elements from the input iterable.

Elements are treated as unique based on their position, not on their value. So if the input elements are unique, there will be no repeat values in each combination.

個人了解:此方法能将傳入的iterable對象裡面的元素按照r的長度進行排列組合,特點是,每個元素都是相對位置是唯一的,并不是按照元素的值去唯一區分,是以,如果傳入的iterable對象裡面的每個元素都是值唯一的,這樣的排列組合中是不會存在元素重複的組合,例如:(‘A’, ‘B’)和(‘B’, ‘A’)不會同時出現,(‘A’, ‘A’),(‘B’, ‘B’), (‘C’, ‘C’)…也不會出現。

舉個例子:

for i in itertools.combinations('ABC', 2):  
	print(i)
	time.sleep(0.5)

# 輸出結果為:  
('A', 'B')
('A', 'C')
('B', 'C')  

# 如果将第一行代碼改為:for i in itertools.combinations('AAC', 2)則輸出結果為:  
('A', 'A')
('A', 'C')
('A', 'C')  
           

四、itertools.combinations_with_replacement

文法:itertools.combinations_with_replacement(iterable, r)

注解:

Return r length subsequences of elements from the input iterable allowing individual elements to be repeated more than once.

Elements are treated as unique based on their position, not on their value. So if the input elements are unique, the generated combinations will also be unique.

個人了解:此處類似于itertools.combinations,但是唯一的差別在于這個方法允許元素自身和自身形成排列組合。

舉個例子:

for i in itertools.combinations_with_replacement('ABC', 2):  
	print(i)
	time.sleep(0.5)  

# 結果輸出為:  
('A', 'A')
('A', 'B')
('A', 'C')
('B', 'B')
('B', 'C')
('C', 'C')  
           

總結

基本上itertools提供的這四種方法能解決絕大多數需要排列組合的場景,各位同仁可以按需使用,更多詳細資訊請查閱官方文檔:

https://docs.python.org/3.6/library/itertools.html