最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

關(guān)于Python中的排列組合生成器詳解

 更新時間:2023年07月05日 10:01:49   作者:小斌哥ge  
這篇文章主要介紹了關(guān)于Python中的排列組合生成器詳解,在Python的內(nèi)置模塊?functools中,提供了高階類?product()?,用于實現(xiàn)多個可迭代對象中元素的組合,返回可迭代對象中元素組合的笛卡爾積,效果相當(dāng)于嵌套的循環(huán),需要的朋友可以參考下

排列組合生成器

在實際的開發(fā)場景中,經(jīng)常需要遍歷多個數(shù)組中的元素,將它們組合在一起使用。要取完所有可能的組合,最基本的方法是使用嵌套的循環(huán),有多少個數(shù)組就嵌套多少層循環(huán)。嵌套循環(huán)是基本的原理,但不夠簡潔,Python中有更優(yōu)雅的方式來實現(xiàn)這種功能。

在Python的內(nèi)置模塊 functools 中,提供了高階類 product() ,用于實現(xiàn)多個可迭代對象(列表、字符串等)中元素的組合,返回可迭代對象中元素組合的笛卡爾積,效果相當(dāng)于嵌套的循環(huán)。為了更直觀地看出效果,下面用代碼對比來看 product 的效果。

product 效果演示

# coding=utf-8
phone = ['iPhone', 'HuaWei', 'Mi']
number = [1, 2, 3]
color = ['白', '黑']
for p in phone:
    for n in number:
        for c in color:
            print(f'{p}{n}{c}', end='  ')
# 調(diào)用product實現(xiàn)元素組合,替代for循環(huán)
import itertools
for p, n, c in itertools.product(phone, number, color):
    print(f'{p}{n}{c}', end='  ')

Output:

iPhone1白  iPhone1黑  iPhone2白  iPhone2黑  iPhone3白  iPhone3黑  HuaWei1白  HuaWei1黑  HuaWei2白  HuaWei2黑  HuaWei3白  HuaWei3黑  Mi1白  Mi1黑  Mi2白  Mi2黑  Mi3白  Mi3黑  
iPhone1白  iPhone1黑  iPhone2白  iPhone2黑  iPhone3白  iPhone3黑  HuaWei1白  HuaWei1黑  HuaWei2白  HuaWei2黑  HuaWei3白  HuaWei3黑  Mi1白  Mi1黑  Mi2白  Mi2黑  Mi3白  Mi3黑 

可以看到,實現(xiàn)相同的功能,for循環(huán)使用了三層嵌套,而 product() 只需要一層循環(huán)。

product 的結(jié)果是生成器,生成器中的每個元素是一個元組,可以直接遍歷,也可以遍歷時解包取出元組中的數(shù)據(jù),還可以與列表推導(dǎo)式配合使用等。

product 用法介紹

在源碼中,對 product 的描述是:Cartesian product of input iterables. Equivalent to nested for-loops. 翻譯成中文:求輸入可迭代對象的笛卡爾積,相當(dāng)于嵌套的for循環(huán)。

解釋一下這句話,

第一,product 的輸入要是可迭代對象,如字符串、列表、元組等。

第二,product 會將可迭代對象中的元素按笛卡爾積進行組合,相當(dāng)于嵌套的循環(huán)。

如果不知道笛卡爾積是什么?這里簡單介紹一下。笛卡爾積(Cartesian product)是指數(shù)學(xué)中將兩個集合 X 和 Y 中的對象組合,第一個對象是 X 中的成員而第二個對象是 Y 中的成員,組合完所有可能的有序?qū)?。笛卡爾積又稱為直積,表示為 X×Y 。例如,假設(shè)集合 X={a, b} ,集合 Y={0, 1, 2} ,則兩個集合的笛卡爾積為 {(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)} 。

product 類就是專門為求笛卡爾積而量身定做的,用途一致,命名也一致(英文單詞一樣,見名知意)。

product 使用時可以傳入多個可迭代對象,結(jié)果會求所有可迭代對象累加的笛卡爾積。product 還有一個 repeat 參數(shù),repeat 用于設(shè)置 product() 中每個可迭代對象的重復(fù)次數(shù),默認(rèn)值為1。如果只傳入一個可迭代對象,求自身的笛卡爾積,可以使用 repeat 參數(shù)指定重復(fù)多少次。例如,product(X, Y, repeat=2) 與 product(X, Y, X, Y) 相同,product(X, repeat=4) 與 product(X, X, X, X) 相同。

X = [1, 2]
Y = ['a', 'b']
itertools.product(X, repeat=4)
for combination in itertools.product(X, Y, X, Y):
    print(combination, end=' ')
print()
# 使用repeat參數(shù)設(shè)置重復(fù)次數(shù)
for combination in itertools.product(X, Y, repeat=2):
    print(combination, end=' ')

Output:

(1, 'a', 1, 'a') (1, 'a', 1, 'b') (1, 'a', 2, 'a') (1, 'a', 2, 'b') (1, 'b', 1, 'a') (1, 'b', 1, 'b') (1, 'b', 2, 'a') (1, 'b', 2, 'b') (2, 'a', 1, 'a') (2, 'a', 1, 'b') (2, 'a', 2, 'a') (2, 'a', 2, 'b') (2, 'b', 1, 'a') (2, 'b', 1, 'b') (2, 'b', 2, 'a') (2, 'b', 2, 'b') 
(1, 'a', 1, 'a') (1, 'a', 1, 'b') (1, 'a', 2, 'a') (1, 'a', 2, 'b') (1, 'b', 1, 'a') (1, 'b', 1, 'b') (1, 'b', 2, 'a') (1, 'b', 2, 'b') (2, 'a', 1, 'a') (2, 'a', 1, 'b') (2, 'a', 2, 'a') (2, 'a', 2, 'b') (2, 'b', 1, 'a') (2, 'b', 1, 'b') (2, 'b', 2, 'a') (2, 'b', 2, 'b') 

更多排列組合生成器及對比

在內(nèi)置模塊 functools 中,用于將多個可迭代對象中的元素排列組合的類不只 product ,還有三個類提供了類似的功能,共同組成了一組非常有用的高階工具。下面依次介紹它們并進行對比。

permutations(iterable[, r]): Return successive r-length permutations of elements in the iterable. 返回可迭代對象中元素的長度為 r 的排列,元素不能重復(fù)。

combinations(iterable, r): Return successive r-length combinations of elements in the iterable. 返回可迭代對象中元素的長度為 r 的組合,元素不能重復(fù)。

combinations_with_replacement(iterable, r): Return successive r-length combinations of elements in the iterable allowing individual elements to have successive repeats. 返回可迭代對象中元素的長度為 r 的組合,允許元素重復(fù)。

product 是求笛卡爾積,permutations 是求排列,combinations 是求組合,combinations_with_replacement 是求組合但允許元素重復(fù)。它們分別是什么結(jié)果?相互之間有什么區(qū)別呢?通過下面的代碼可以進行對比。

# 笛卡爾積
for p in itertools.product('ABCD', repeat=2):
    print(p, end=' ')
print('\n', '-'*20)
# 排列
for pe in itertools.permutations('ABCD', 2):
    print(pe, end=' ')
print('\n', '-'*20)
# 組合
for c in itertools.combinations('ABCD', 2):
    print(c, end=' ')
print('\n', '-'*20)
# 組合,元素可以重復(fù)
for cr in itertools.combinations_with_replacement('ABCD', 2):
    print(cr, end=' ')

Output:

('A', 'A') ('A', 'B') ('A', 'C') ('A', 'D') 
('B', 'A') ('B', 'B') ('B', 'C') ('B', 'D')
('C', 'A') ('C', 'B') ('C', 'C') ('C', 'D') 
('D', 'A') ('D', 'B') ('D', 'C') ('D', 'D') 
 --------------------
('A', 'B') ('A', 'C') ('A', 'D') 
('B', 'A') ('B', 'C') ('B', 'D') 
('C', 'A') ('C', 'B') ('C', 'D') 
('D', 'A') ('D', 'B') ('D', 'C') 
 --------------------
('A', 'B') ('A', 'C') ('A', 'D') 
('B', 'C') ('B', 'D') ('C', 'D') 
 --------------------
('A', 'A') ('A', 'B') ('A', 'C') ('A', 'D') 
('B', 'B') ('B', 'C') ('B', 'D') 
('C', 'C') ('C', 'D') ('D', 'D') 

四個生成器返回的結(jié)果中都是元組,為了更直觀地對比效果,將結(jié)果整理如下:

product('ABCD', repeat=2)
AA AB AC AD BA BB BC BD CA CB CC CD DA DB DC DD

permutations('ABCD', 2)
AB AC AD BA BC BD CA CB CD DA DB DC

combinations('ABCD', 2)
AB AC AD BC BD CD

combinations_with_replacement('ABCD', 2)
AA AB AC AD BB BC BD CC CD DD

permutations 與 product 對比,比 product 少了元素相同的情況,從可迭代對象中取出 r 個元素,元素順序相反屬于不同情況,結(jié)果中會保留。 combinations 與 permutations 對比,combinations 中元素順序相反的結(jié)果屬于相同情況,結(jié)果中不重復(fù)保留,也就是說 combinations (組合)是無序的, permutations (排列)是有序的。combinations_with_replacement 與 combinations 對比,combinations_with_replacement 中允許相同元素重復(fù)被取,結(jié)果中多了兩個元素相同的情況。

這三個類的參數(shù)都有且只有一個可迭代對象,不能同時傳入多個可迭代對象。另一個參數(shù) r 是從可迭代對象中選取 r 個元素來排列組合,permutations 的 r 不是必傳參數(shù),默認(rèn)為可迭代對象的長度,permutations 和 combinations 的結(jié)果中不允許元素重復(fù),所以 r 大于可迭代對象長度時結(jié)果為空,combinations_with_replacement 的結(jié)果允許元素重復(fù),r 可以大于可迭代對象長度。

總結(jié)

1.四個生成器的用法和區(qū)別已經(jīng)介紹完,它們相當(dāng)于工具箱中的一組高級工具,可以根據(jù)不同的場景選用,提高代碼的優(yōu)雅性。

2.在一些特殊場景,我們知道要用多層循環(huán)嵌套,但是循環(huán)的嵌套層數(shù)是動態(tài)的,導(dǎo)致無法下手寫循環(huán)代碼,此時可以巧妙地用 product 解決問題。這點后面我會在實際的問題中說明。 

到此這篇關(guān)于關(guān)于Python中的排列組合生成器詳解的文章就介紹到這了,更多相關(guān)Python排列組合生成器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python檢查 云備份進程是否正常運行代碼實例

    Python檢查 云備份進程是否正常運行代碼實例

    這篇文章主要介紹了Python檢查 云備份進程是否正常運行代碼實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-08-08
  • Python文件簡單操作及openpyxl操作excel文件詳解

    Python文件簡單操作及openpyxl操作excel文件詳解

    這篇文章主要為大家詳細(xì)介紹了python對文件的簡單使用及openpyxl操作excel文件的方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2022-10-10
  • Python識別二維碼的兩種方法詳解

    Python識別二維碼的兩種方法詳解

    在學(xué)習(xí)Python處理二維碼的過程中,我們看到的大多是“用python生成酷炫二維碼”、“用Python制作動圖二維碼”之類的文章。而關(guān)于使用Python批量識別二維碼的教程,并不多見。本文就為大家總結(jié)了Python識別二維碼的兩種方法,感興趣的可以學(xué)習(xí)一下
    2022-06-06
  • Python組合數(shù)據(jù)類型使用及說明

    Python組合數(shù)據(jù)類型使用及說明

    本文詳細(xì)介紹了Python中列表、元組和字典的基本操作,包括創(chuàng)建、遍歷、修改、刪除元素,以及常見的內(nèi)置函數(shù)和方法,同時,還涉及了字符串和列表之間的相互轉(zhuǎn)換
    2026-03-03
  • python實現(xiàn)手機銷售管理系統(tǒng)

    python實現(xiàn)手機銷售管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了python實現(xiàn)手機銷售管理系統(tǒng),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • Python如何使用input函數(shù)獲取輸入

    Python如何使用input函數(shù)獲取輸入

    這篇文章主要介紹了Python如何使用input函數(shù)獲取輸入,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-08-08
  • Python之list對應(yīng)元素求和的方法

    Python之list對應(yīng)元素求和的方法

    今天小編就為大家分享一篇Python之list對應(yīng)元素求和的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-06-06
  • Python創(chuàng)建自己的加密貨幣的示例

    Python創(chuàng)建自己的加密貨幣的示例

    這篇文章主要介紹了Python創(chuàng)建自己的加密貨幣的示例,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下
    2021-03-03
  • Python?一篇文章看懂Python集合與字典數(shù)據(jù)類型

    Python?一篇文章看懂Python集合與字典數(shù)據(jù)類型

    集合并不是一種數(shù)據(jù)處理類型,而是一種中間類型。集合(set)是一個無序、不重復(fù)的元素序列,經(jīng)常被用來處理兩個列表進行交并差的處理性。本文將詳細(xì)講解集合的一些常用方法,感興趣的可以了解一下
    2022-03-03
  • Python進行Restful?API開發(fā)實例詳解

    Python進行Restful?API開發(fā)實例詳解

    這篇文章主要介紹了Python進行Restful?API開發(fā)實例,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03

最新評論

平遥县| 介休市| 唐河县| 噶尔县| 正蓝旗| 汉寿县| 阿克| 平南县| 永登县| 扶沟县| 报价| 孟连| 晋城| 岚皋县| 石门县| 丽江市| 鹤峰县| 许昌市| 高雄县| 大姚县| 育儿| 阳西县| 昌平区| 航空| 香港| 长寿区| 儋州市| 阜阳市| 商都县| 当雄县| 徐汇区| 通河县| 石城县| 军事| 武鸣县| 固阳县| 武城县| 通州市| 滕州市| 凤凰县| 定陶县|