Python中Anagram函数对部分单词莫名返回False的问题排查
问题分析
你的代码核心问题是双重循环会重复统计相同字符:比如anagram里的每个a,都会和nagaram里的所有a匹配一次,导致计数远超过字符串实际长度。比如两个单词都是7个字符,但你的计数器会算出13——因为3个a互相匹配就贡献了9次,加上其他字符的匹配,总次数自然不对。
修复方案
这里给你几种简单靠谱的实现方式:
方法1:排序后比较
变位词排序后字符顺序完全一致,直接排序后对比即可:
def is_anagram(worda: str, wordb: str) -> bool: if len(worda) != len(wordb): return False return sorted(worda) == sorted(wordb) print(is_anagram("anagram", "nagaram")) # 输出True
方法2:用Counter统计字符频率
Python的collections.Counter可以直接统计每个字符的出现次数,两个变位词的Counter必然相等:
from collections import Counter def is_anagram(worda: str, wordb: str) -> bool: return Counter(worda) == Counter(wordb) print(is_anagram("anagram", "nagaram")) # 输出True
方法3:手动统计字符(不用内置库)
如果不想用内置库,可以手动用字典统计每个字符的出现次数,再对比:
def is_anagram(worda: str, wordb: str) -> bool: if len(worda) != len(wordb): return False count = {} # 统计第一个单词的字符频率 for char in worda: count[char] = count.get(char, 0) + 1 # 用第二个单词抵消计数 for char in wordb: if count.get(char, 0) == 0: return False count[char] -= 1 # 所有计数都应为0 return all(v == 0 for v in count.values()) print(is_anagram("anagram", "nagaram")) # 输出True
内容的提问来源于stack exchange,提问作者Yael Chen
相关产品推荐
相关产品推荐

