Python 列表中分組字謎
在本教程中,我們將編寫一個程式,將列表中的所有字謎分組。首先,讓我們看看什麼是**字謎**。
任何兩個字串,如果具有相同的字元但順序不同,則稱為字謎。
在深入瞭解解決方案之前,讓我們看一個示例。
輸入
['cat', 'dog', 'fired', 'god', 'pat', 'tap', 'fried', 'tac']
輸出
[['cat', 'tac'], ['dog', 'god'], ['fried', 'fired'], ['pat', 'tap']]
我們將把問題分解成兩個部分。首先,我們將編寫一個函式來檢查兩個字串是否為字謎。請按照以下步驟編寫檢查字謎的程式碼。
- 初始化字串。
- 對兩個字串進行排序。
- 如果兩個排序後的字串相等,則返回True,否則返回False。
示例
# simple lambda function to check whether two strings are anagrams or not are_anagrams = lambda x, y: str(sorted(x.lower())) == str(sorted(y.lower())) # calling the function print(are_anagrams('cat', 'tac')) print(are_anagrams('cat', 'Tac')) print(are_anagrams('cat', 'dog'))
輸出
如果執行以上程式碼,則將獲得以下結果。
True True False
現在,我們知道了如何檢查兩個字串是否為字謎。但是,這不足以解決我們的問題。我們需要將列表中的所有字謎作為子列表進行分組(儲存)。
我們如何解決這個問題?
最佳實踐是使用字典對元素進行分組。我們將為相關的字謎使用一個鍵。如果您不熟悉 Python,這有點令人困惑。讓我們看看實現我們想要目標的步驟。
- 初始化字串列表。
- 初始化一個空字典。
- 遍歷列表。
- 對字串進行排序。
- 檢查它是否在字典中。
- 如果它存在於字典中,則將字串追加到其列表中。
- 否則,使用包含當前字串的列表初始化鍵以儲存字謎。
- 將字典的所有值列印到列表中。
示例
# initialzing a list of strings anagrams = ['cat', 'dog', 'fired', 'god', 'pat', 'tap', 'fried', 'tac'] # initializing an empty dict grouped_anagrams = {} # iterating over the list to group all anagrams for string in anagrams: # sorting the string sorted_string = str(sorted(string)) # checking the string in dict if sorted_string in grouped_anagrams: # adding the string to the group anagrams grouped_anagrams[sorted_string].append(string) else: # initializing a list with current string grouped_anagrams[sorted_string] = [string] # printing the values of the dict (anagram groups) print(list(grouped_anagrams.values()))
輸出
如果執行以上程式碼,則將獲得以下結果。
[['dog', 'god'], ['pat', 'tap'], ['cat', 'tac'], ['fired', 'fried']]
結論
您也可以使用不同的方法解決問題。有一個名為**defaultdict**的資料結構可以幫助您避免在字典中檢查鍵。您可以探索它並相應地更改程式碼。
如果您在本教程中有任何疑問,請在評論部分中提及。
廣告