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**的資料結構可以幫助您避免在字典中檢查鍵。您可以探索它並相應地更改程式碼。

如果您在本教程中有任何疑問,請在評論部分中提及。

更新於: 2020-07-06

4K+ 次瀏覽

啟動您的 職業生涯

透過完成課程獲得認證

開始
廣告