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

Python遍历列表实现罗马数字转整数报TypeError问题

报错根因

你遇到的TypeError: list indices must be integers or slices, not str来自几个核心错误:

  • 写for x in newvalue循环时,循环变量x拿到的是列表里存储的元素本身——也就是你输入的罗马数字字符(比如'I'、'V'这类字符串),不是列表的整数下标,直接拿字符串当索引去取newvalue[x]必然触发类型错误。
  • 你写的for i in newvalue: globals()[i]只是读取了全局域里对应字符名的变量值,没有做任何赋值操作,newvalue列表里存的始终是原始字符串,根本没有转换成整数。
  • 代码里i = int、x = int两行没有任何实际作用,只是把两个变量赋值为int类型本身,不会自动完成类型转换。
  • 你之前写的相邻两位直接相加的逻辑也不符合罗马数字转换规则:罗马数字中如果小数值出现在大数值左侧,需要用大值减小值(比如IV是4、IX是9),不是简单相加。
修正后代码

这类字符到数值的映射场景不要用全局变量动态取值,直接用字典存储映射关系是标准写法,逻辑更清晰也更易维护,完整可运行代码如下:

# 罗马字符与对应整数值的映射
roman_map = {
    'I': 1,
    'V': 5,
    'X': 10,
    'L': 50,
    'C': 100,
    'D': 500,
    'M': 1000
}

def roman_to_int():
    entry = input('Enter a Roman Numeral \n').strip().upper()
    total = 0
    str_len = len(entry)
    for idx in range(str_len):
        current_val = roman_map[entry[idx]]
        # 当前值小于右侧相邻值时,减去当前值
        if idx < str_len - 1 and current_val < roman_map[entry[idx+1]]:
            total -= current_val
        # 其余情况累加当前值
        else:
            total += current_val
    print(total)

roman_to_int()
  • 遍历罗马数字串时,通过整数下标取当前位和下一位的映射值
  • 遵循罗马数字计算规则:当前位值小于右侧位值时做减法,其余情况做加法,遍历完成后得到的总和就是最终结果
  • 自动对输入做去空格、转大写处理,兼容用户小写输入、前后误输入空格的场景

内容的提问来源于stack exchange,提问作者FrayGlider

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 05:18:18