如何检查两个字符串是否为同构词?
我正在尝试写一个程序,让用户输入两个字符串:
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
使用——你根本不需要用到range
或len
。if .. in
语句可以帮助你检查一个字母是否在字符串中,比如if letter in mystring:
是一个有效的语句,这样可以帮到你,同样也不需要用到range
或len
。尽量避免在变量名中使用数字——用
word_one
和word_two
这样的命名会更好。