Python - 從給定字元中生成長度為 K 的組合


從給定字元中生成長度為 K 的組合是指,我們可以使用給定字元建立的、長度正好為 K 的字元組合。在本文中,我們將探討實現這一目標的幾種方法,例如遞迴、map 和 lambda 函式、itertools 庫等。雖然遞迴和 lambda 函式是自定義函式,但 itertools 提供了生成組合的內建方法。

使用遞迴

遞迴是傳統的程式設計技巧之一。在這種技術中,我們嘗試將一個大問題分解成更小的子問題,我們的目標是解決這些子問題,最終解決大問題。遞迴方法有一個基本情況;我們需要執行遞迴,直到我們到達遞迴的基本情況。

示例

在下面的示例中,我們建立了一個名為 generate_combinations 的函式,它接收字元和所需序列的長度作為引數。在函式內部,我們首先建立了一個空列表來儲存我們的答案。接下來,在該函式中,我們建立了另一個名為 generate_helper 的函式,它將附加長度等於 k 的組合,這些組合是由我們傳遞給函式的字元生成的。我們返回了該列表。為了測試該函式,我們建立了一個名為 characters 的字元列表,呼叫了 generate_combinations 函式,並列印了結果。

def generate_combinations(characters, k):
    combinations_list = []

    def generate_helper(current_combination, remaining_characters):
        if len(current_combination) == k:
            combinations_list.append(current_combination)
            return

        for char in remaining_characters:
            generate_helper(current_combination + char, remaining_characters)

    generate_helper('', characters)
    return combinations_list

characters = ['A', 'B', 'C', 'D', 'E']
k = 2

result = generate_combinations(characters, k)
print(result)

輸出

['AA', 'AB', 'AC', 'AD', 'AE', 'BA', 'BB', 'BC', 'BD', 'BE', 'CA', 'CB', 'CC', 'CD', 'CE', 'DA', 'DB', 'DC', 'DD', 'DE', 'EA', 'EB', 'EC', 'ED', 'EE']

使用 itertools 庫生成長度為 K 的組合

Python 中的 itertools 庫是一個強大的工具,它提供了一些可以有效地組合可迭代物件的函式。該庫預設可用;因此,我們不需要單獨安裝該庫。使用該庫的優點在於它記憶體效率高。因此,在處理大型資料時,如果記憶體效率和效能很重要,我們應該使用該庫。

示例

在下面的程式碼中,我們首先從 Python 的 itertools 庫中匯入了 product 模組。接下來,我們建立了一個名為 generate_combinations 的函式,它接收字元序列和我們要構建的序列的長度作為引數。在這個函式中,我們使用 product 方法建立了一個可能的組合列表。由於組合是元組,因此我們使用了字串的 join 方法從列表中提取字串。

from itertools import product

def generate_combinations(characters, k):
    combinations_list = list(product(characters, repeat=k))
    combinations_strings = [''.join(comb) for comb in combinations_list]
    return combinations_strings

characters = ['A','B','C','D','E']
k = 2

result = generate_combinations(characters, k)
print(result)

輸出

['AA', 'AB', 'AC', 'AD', 'AE', 'BA', 'BB', 'BC', 'BD', 'BE', 'CA', 'CB', 'CC', 'CD', 'CE', 'DA', 'DB', 'DC', 'DD', 'DE', 'EA', 'EB', 'EC', 'ED', 'EE']

使用 Map Lambda 函式

lambda 函式是定義函式的一種便捷方式,無需定義函式的名稱。當我們想要一個快速的操作,但確定它只會在程式中使用一次時,該函式很有用。因此,當您確定不需要程式碼的可重用性並且邏輯足夠小時,建立 lambda 函式是一個好習慣。

另一方面,Map 將任何函式應用於可迭代物件的所有元素。它接受兩個引數:函式的名稱和可迭代物件。對於我們的用例,我們可以使用 product 方法生成所有組合,並使用 map 和 lambda 函式從組合中建立一個字串。

示例

在下面的程式碼中,我們使用了 itertools 模組的“product”方法。我們建立了 generate_combinations 函式,它接收字元列表和長度 k 作為引數。在函式內部,我們使用 product 方法生成所有組合。我們將序列和輸出序列的 k 長度作為引數傳遞。接下來,我們結合 map 和 lambda 函式將它們轉換為字串序列。最後,我們返回生成的列表。

from itertools import product

def generate_combinations(characters, k):
    combinations_list = list(product(characters, repeat=k))
    combinations_strings = list(map(lambda comb: ''.join(comb), combinations_list))
    return combinations_strings

characters = ['P','Q','R','S','T']
k = 2

result = generate_combinations(characters, k)
print(result)

輸出

['PP', 'PQ', 'PR', 'PS', 'PT', 'QP', 'QQ', 'QR', 'QS', 'QT', 'RP', 'RQ', 'RR', 'RS', 'RT', 'SP', 'SQ', 'SR', 'SS', 'ST', 'TP', 'TQ', 'TR', 'TS', 'TT']

結論

在本文中,我們瞭解瞭如何從給定字元中生成長度為 K 的組合。我們可以建立自己的邏輯來執行相同的操作。或者,Python 還為我們提供了多個庫來實現此目的。我們可以使用遞迴技術,其目標是解決問題的較小子集。接下來,我們可以使用 itertools 庫的“product”方法。為了方便起見,我們還可以將 lambda 函式和 map 方法與 product 方法結合使用。

更新於: 2023年7月18日

272 次檢視

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.