遍历字典与二维列表时出现float与str比较的TypeError问题
问题分析与解决
问题描述
实现的generate_terrain函数旨在将二维列表world中的数值按照terrain_probability_dict映射为对应字符串,但运行时触发TypeError: '<' not supported between instances of 'float' and 'str'错误。测试发现错误出现的位置与二维列表尺寸相关,且列表中提前出现了字符串值。
错误原因
函数的循环逻辑存在缺陷:
- 外层循环遍历排序后的字典键区间(
for i in range(1, len(keys))) - 每次外层循环都会完整遍历整个二维列表,当某个位置的数值在之前的循环中已被替换为字符串后,后续循环再次访问该位置时,会尝试将字符串与数值(
keys[i-1])做大小比较,直接触发类型错误。
修复方案
有两种可靠的修复思路:
思路1:创建新列表存储结果(推荐)
不修改原world列表,而是生成一个新的二维列表存储映射后的结果,彻底避免原列表被修改后引发的类型冲突。
思路2:循环时跳过已替换的字符串
在判断条件前先检查当前元素是否为数值类型(float或int),仅处理未被替换的元素。
修复后的代码示例
思路1实现
terrain_probability_dict = {-1: "e", 0.2: "o", 0.5: "M", 1: "#"} def generate_terrain(world: list[list[float | int]]) -> list[list[str]]: keys = sorted(terrain_probability_dict.keys()) # 创建新的二维列表存储结果 new_world = [] for row in world: new_row = [] for val in row: # 找到val对应的区间并映射 for i in range(1, len(keys)): if keys[i-1] < val <= keys[i]: new_row.append(terrain_probability_dict[keys[i]]) break new_world.append(new_row) return new_world
思路2实现
terrain_probability_dict = {-1: "e", 0.2: "o", 0.5: "M", 1: "#"} def generate_terrain(world: list[list[float | int]]): keys = sorted(terrain_probability_dict.keys()) for i in range(1, len(keys)): for y in range(len(world)): for x in range(len(world[0])): # 仅处理数值类型的元素 val = world[y][x] if isinstance(val, (float, int)): if keys[i-1] < val <= keys[i]: world[y][x] = terrain_probability_dict[keys[i]]
内容的提问来源于stack exchange,提问作者Navid Yaghmaei
相关产品推荐
相关产品推荐

