You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 04:48:18