如何用浮点值取整后的整数查找字典中的浮点型键
问题分析
你现在的核心需求是:原本用随机浮点数作为字典键存储平面坐标,现在想通过取整后的整数来查找对应的坐标(比如用整数10找到键为10.3的坐标)。现有代码的问题在于:字典的键是原始浮点数,直接用整数查找会失败;同时生成随机数时,numbers列表存的是取整后的整数,但字典键是未取整的浮点数,两者没有关联。
解决方案
根据你是否允许多个浮点数取整后对应同一个整数,提供两种方案:
方案1:每个整数对应唯一浮点数键
如果要求取整后的整数不重复(即每个整数只对应一个坐标),可以新增一个反向映射字典,把整数映射到对应的浮点数键,这样就能快速查找:
修改后的完整代码
import random # 记得导入random模块 x_amount = int(input("Height of room: ")) y_amount = int(input("Width of room: ")) Room_Total = x_amount * y_amount numbers = [] length = len(str(Room_Total)) + 1 x_values = {} y_values = {} int_to_float = {} # 新增:存储整数到浮点数键的映射 create_number = y_amount def num_find(target_int): if target_int in int_to_float: float_key = int_to_float[target_int] x_coord = x_values[float_key] y_coord = y_values[float_key] print(f"找到坐标:x={x_coord}, y={y_coord}") else: print(f"不存在整数{target_int}对应的点") for num in range(1, y_amount + 1): for n in range(1, x_amount + 1): number = 1 while number != 0: number = random.uniform(1, Room_Total) int_num = round(number) # 确保浮点数键和取整后的整数都不重复 if number not in numbers and int_num not in int_to_float: numbers.append(number) int_to_float[int_num] = number x_values[number] = num y_values[number] = n number = 0 plane = input("Want to see the plane? y/n ") if plane == "y": create_number = y_amount # 重置变量,避免之前循环影响 for i in numbers: num_gap = length - len(str(round(i))) # 用取整后的数计算长度 create_number -= 1 if create_number == -1: print("") create_number = y_amount - 1 print(round(i), end=" ") for _ in range(num_gap): print(" ", end="") else: print(round(i), end=" ") for _ in range(num_gap): print(" ", end="")
方案2:允许多个浮点数取整后对应同一个整数
如果允许多个坐标的浮点数键取整后是同一个整数,只需修改num_find函数,遍历所有键判断匹配即可:
修改后的num_find函数
def num_find(target_int): matched_coords = [] # 遍历所有浮点数键,判断取整后是否匹配目标整数 for float_key in x_values: if round(float_key) == target_int: matched_coords.append((x_values[float_key], y_values[float_key])) if matched_coords: print(f"找到{len(matched_coords)}个匹配坐标:{matched_coords}") else: print(f"没有找到整数{target_int}对应的点")
注意事项
- 原有代码中打印网格的部分存在缩进错误(
else的缩进层级不正确),已在方案1的代码中修正 - 生成随机数时,
random.uniform(1, Room_Total)生成的是[1, Room_Total)区间的浮点数,如果需要包含Room_Total,可以改用random.uniform(1, Room_Total+1)
内容的提问来源于stack exchange,提问作者Eutopia
相关产品推荐
相关产品推荐

