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

遍历字典与二维列表时出现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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 12:52:33