统计数组内笑脸数量的Python代码返回错误结果原因排查
错误原因分析
- 未限制合法笑脸的长度:符合规则的笑脸只能是2位(无鼻子)或者3位(带鼻子),你的代码没有做长度校验,会出现两个问题:一是长度≥4的字符串(比如
:---))只要首尾符合要求就会被误判;二是如果数组中存在空字符串,访问e[0]、e[-1]会直接触发索引越界报错。 - 未校验中间位字符:当字符串长度为3时,中间位必须是
-或~才算合法鼻子,你的代码会把:x)、;aD这类中间为非法字符的字符串也判定为合法笑脸。
举个测试用例为例:
输入数组为[':)', ';~D', ':x)', '---)', ''],你的代码会返回3(错误统计了:x)),但正确结果应该是2。
修正方案
你可以通过长度判断+字符校验的方式修复:
def count_smileys(arr): counter = 0 valid_eyes = {':', ';'} valid_noses = {'-', '~'} valid_mouths = {')', 'D'} for e in arr: length = len(e) if length == 2: if e[0] in valid_eyes and e[1] in valid_mouths: counter +=1 elif length ==3: if e[0] in valid_eyes and e[1] in valid_noses and e[2] in valid_mouths: counter +=1 return counter
也可以用正则匹配更简洁:
import re def count_smileys(arr): pattern = r'^[:;][-~]?[)D]$' return sum(1 for s in arr if re.match(pattern, s))
内容的提问来源于stack exchange,提问作者Ryshardoo
相关产品推荐
相关产品推荐

