Python3+itertools實現排列組合教程


一、說明

本文的直接起因是上周公司的一個比賽用到了排列組合,之前沒用過,這里記一記。

本文說的排列組合是借助itertools實現,而不是自己寫代碼實現。

itertools的其他一些函數還是比較有意思的,所以在最后也會做下簡單的介紹。

 

二、排列組合實現

功能需求 總數算法 實現函數 示例 示例輸出
元素可重復使用的排列 n的m次方 product(*iterables, repeat=1) product('ABCD', repeat=2) AA AB AC AD BA BB BC BD CA CB CC CD DA DB DC DD
元素不可重復使用的排列 A n m permutations(iterables, r=None) permutations('ABCD', 2) AB AC AD BA BC BD CA CB CD DA DB DC
元素可重復使用的組合 C n m + n combinations_with_replacement(iterable, r) combinations_with_replacement('ABCD', 2) AA AB AC AD BB BC BD CC CD DD
元素不可重復使用的組合 C n m combinations(iterable, r) combinations('ABCD', 2) AB AC AD BC BD CD
 

說明:

1. 上邊函數的第一個參數iterables表示可迭代的對象,包括字符串、列表等等。所以排列組合的元素如果不是字母而是字符串也是可以的,如permutations(['AB', 'CD', 'EFG'], 2)。

2. 上邊函數的第二個參數都是參與排列組合的元素個數。

 

三、itertools其他函數

3.1 無窮類函數

功能 實現函數 示例 示例輸出
從某個數開始,按給定步長一直數下去 count(start=0, step=1) count(10, 2) 10 12 14 ...
不斷循環輸出給出的元素 cycle(iterable) cycle('ABC') A B C A B C ...
不斷重復/重復給定次數給定元素 repeat(object[, times]) repeat(10, 3) 10 10 10
 

3.2 分組遍歷函數---groupby()

假設我們有一個如下字典組成的列表,列表中每個字典記錄了每個學生的一門課程成績,在遍歷時我們想先打印A同學的各科成績,再打印B同學的各科成績。這時就可借助groupby()函數實現這個需求。

from itertools import groupby

student_score_dict_list = [
    {
        "student_name": "A",
        "course_name": "語文",
        "scores": 80
    },
    {
        "student_name": "B",
        "course_name": "數學",
        "scores": 91
    },
    {
        "student_name": "B",
        "course_name": "語文",
        "scores": 90
    },
    {
        "student_name": "A",
        "course_name": "數學",
        "scores": 81
    },
]

# 定義一個函數,這個函數的作用是傳給他一個值,它返回代表這個值的值或表表參與比較等操作
# 如果是列表那就先按第一個排,第一個值相同再按第二個值排
# 用lambda表達示還是用def效果一樣的
# 排序使用的選取代表值的方法,我們先以學生名排序,再以課程名排序
# 這里有點小尷尬的是在編碼上“數學”比“語文”小,所以“數學”會排前面;如果是數值可以在前面加個負號,字符串還不好處理
sort_key_func = lambda x: (x["student_name"], x["course_name"])
# 分組時使用的選取代表值的方法,我們先以學生名進行分組
groupby_key_func = lambda x: x["student_name"]

sorted_student_score_dict_list = sorted(student_score_dict_list, key=sort_key_func)
groupby_student_score_dict_list = groupby(sorted_student_score_dict_list, key=groupby_key_func)

for student, one_student_score_dict_list in groupby_student_score_dict_list:
    print(f"{student} scores: ")
    for student_score_dict in one_student_score_dict_list:
        print(f"\t{student_score_dict['course_name']}: {student_score_dict['scores']}")
View Code

實現效果如下:

 

 

參考:

https://docs.python.org/3/library/itertools.html#module-itertools


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM