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
相关产品推荐
相关产品推荐

