新手求助:编写Pangram判断函数时运行报错,求排查解决
Pangram判断函数错误修复
先看你代码里的几个核心问题:
- 循环嵌套冗余:
sen是去掉空格后的字符串,for words in sen已经在遍历每一个字符了,再套一层for letter in words完全没必要,此时letter和words是同一个字符,纯属多此一举。 - 大小写不匹配导致删除失败:你用
letter.lower()判断字符是否在字母列表里,但删除的是原letter(比如原字符是大写A,letter.lower()是a在列表中,但你删的是A,列表里只有小写a,自然找不到,触发ValueError)。 - 字母列表混入多余元素:列表末尾的整数
1完全没必要,还会干扰后续判断逻辑,直接删掉即可。 - 重复字符触发删除错误:如果句子里同一个字母出现多次,第一次删除后列表里就没这个字母了,第二次再删就会因为找不到元素报错。
给你改好的代码,每一步都加了注释方便理解:
def panagram(sen): # 把输入句子统一转成小写,同时去掉空格 sen_lower = sen.lower().replace(" ", "") # 用集合存储完整小写字母,集合判断存在性更快,还能自动去重 alphabets = set("abcdefghijklmnopqrstuvwxyz") # 遍历处理后的句子字符 for char in sen_lower: # 如果字符在字母集合里,就移除它 if char in alphabets: alphabets.remove(char) # 集合为空说明所有字母都覆盖到了 return "PANAGRAM" if not alphabets else "Not Panagram"
测试示例:
- 输入
"The quick brown fox jumps over the lazy dog"会返回PANAGRAM - 输入
"Hello World"会返回Not Panagram
另外给你一个更简洁的写法,利用集合的子集判断特性:
def panagram(sen): sen_chars = set(sen.lower().replace(" ", "")) # 判断26个字母是否都是句子字符集合的子集 return "PANAGRAM" if sen_chars >= set("abcdefghijklmnopqrstuvwxyz") else "Not Panagram"
内容的提问来源于stack exchange,提问作者Shubh Sharma
相关产品推荐
相关产品推荐

