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+ 次浏览

启动您的 职业生涯

通过完成课程获得认证

开始
广告

© . All rights reserved.