Python如何编写输入姓名按字母序数值计算输出排名的函数
问题描述
需要实现一个姓名排名计算函数,规则为:将姓名中每个字母按其在字母表中的位置对应数值(a=1、b=2……z=26)求和,最终输出总和作为排名。例如输入name = "ab"时,输出结果为3。原有实现运行不符合预期,需要找到最优实现方案。
原有错误代码如下:
import string x = "richard" y = "donald" c = "Sam" numbers = [] for i in range(1,27): numbers.append(i) print(numbers) alphabet_string = string.ascii_lowercase alphabet_list = list(alphabet_string) print(alphabet_list) new_x = list(x) new_y = list(y) new_c = list(c) zip_iterators = zip(alphabet_list,numbers) dic = list(zip_iterators) print(dic) def rank(name): rank = 0 for l in range(0,len(name)): for k,v in dic: if l == k: v += rank print(rank) rank(new_c)
原代码问题点
- 未做大小写兼容:映射关系仅覆盖小写字母,输入含大写字母(如
Sam的首字母S)时完全无法匹配 - 遍历逻辑错误:循环取的是姓名的索引数字,不是姓名中的实际字符,根本没有拿到字母做匹配
- 累加逻辑错误:匹配到对应数值时,错误地将结果加到临时变量
v上,没有更新存储总和的rank变量,导致rank始终为初始值0 - 映射结构选型错误:把字母和数值的对应关系存成元组列表,每次匹配都要遍历全量26个字母,效率低,应该用字典实现O(1)查询
最优实现方案
不需要手动构造字母映射表,直接利用Python内置的ord()函数获取字符ASCII码即可计算对应数值,代码最简洁、运行效率最高:
def calculate_name_rank(name: str) -> int: total = 0 # 统一转小写,自动兼容大写字母输入 for char in name.lower(): # ord('a')的ASCII值为97,计算后刚好匹配a=1、b=2...z=26的规则 total += ord(char) - ord('a') + 1 return total # 测试验证 if __name__ == "__main__": print(calculate_name_rank("ab")) # 输出3,符合示例要求 print(calculate_name_rank("richard")) # 输出61 print(calculate_name_rank("donald")) # 输出50 print(calculate_name_rank("Sam")) # 输出33,自动适配大写首字母
如果希望沿用手动构造字母映射表的思路,也可以用字典推导式简化映射构造逻辑:
import string # 一次性构造字母-数值映射字典,全局复用 letter_value = {char: idx + 1 for idx, char in enumerate(string.ascii_lowercase)} def calculate_name_rank(name: str) -> int: return sum(letter_value[char] for char in name.lower())
内容的提问来源于stack exchange,提问作者samuel crhis
相关产品推荐
相关产品推荐

