如何检查两个字符串是否为同构词?

14 投票
27 回答
67800 浏览
提问于 2025-04-17 16:33

我正在尝试写一个程序,让用户输入两个字符串:

s1 = input("Please enter a word:")
s2 = input("Please enter another word:")

如果这两个字符串是字母异位词(也就是用相同的字母组成的不同单词),我该如何输出True,否则输出False呢?


如果你是通过搜索引擎找到这个问题,并且想在一个列表中查找多个字母异位词:这样做是可行的,但效率不高,因为你需要比较每一对元素。有关更具体的建议,请查看使用Python查找单词列表中的字母异位词

27 个回答

18

你可以使用来自 collections 库的神奇 Counter

根据文档的描述:

它是一个无序的集合,里面的元素作为字典的键存储,而它们的数量则作为字典的值存储。

所以,你可以用一个字符串(可迭代对象)来初始化一个 Counter 对象,并且可以和另一个字符串生成的 Counter 进行比较。

from collections import Counter

def is_anagram(str1, str2):
   return Counter(str1) == Counter(str2)
46

为什么不直接对字符串进行排序呢?

>>> sorted('anagram')
['a', 'a', 'a', 'g', 'm', 'n', 'r']
>>> sorted('nagaram')
['a', 'a', 'a', 'g', 'm', 'n', 'r']
>>> sorted('anagram') == sorted('nagaram')
True
5

你需要再仔细想想你的条件逻辑。这个循环的方向是对的,但如果在s1中有一个字母不在s2里,你应该立刻break跳出这个循环,并打印“False”。可以考虑用一个变量,比如all_s1_in_s2 = True,然后如果发现有字母不匹配,就把它设为false。

还有一些其他的小建议:

  • for l in s1会逐个遍历字符串s1,让你可以按顺序访问每个字母,作为l使用——你根本不需要用到rangelen

  • if .. in语句可以帮助你检查一个字母是否在字符串中,比如if letter in mystring:是一个有效的语句,这样可以帮到你,同样也不需要用到rangelen

  • 尽量避免在变量名中使用数字——用word_oneword_two这样的命名会更好。

撰写回答