如何将ID集合关联到Python哈希表对象并供算法遍历
解决AttributeError:整数ID无法访问Package对象属性的问题
问题根源在于Truck.packagesLoad存储的是包裹ID(整数),但算法中直接将其当作Package对象访问address属性,导致报错。以下是针对性的修复方案:
核心修改思路
- 关联ID与Package对象:遍历
packagesLoad中的ID时,从哈希表myHash中取出对应的Package实例。 - 修正删除逻辑:由于
packagesLoad存储的是ID,删除操作需要基于ID而非对象执行。
修改后的完整代码
# 遍历t1上的所有包裹,直到packagesLoad为空 while len(t1.packagesLoad) > 0: minValue = 1000 minPackage = None min_package_id = None # 记录最近包裹的ID,用于后续删除 # 遍历packagesLoad中的每个包裹ID for pkg_id in t1.packagesLoad: # 从哈希表中获取对应的Package对象 pkg1 = myHash.lookup(pkg_id) # 计算当前地址到包裹地址的距离 milesBetween = distanceBetween(t1.currentAddress, pkg1.address, addressList, list2DDistances) if milesBetween < minValue: minPackage = pkg1 minValue = milesBetween min_package_id = pkg_id # 记录该包裹的ID # 更新卡车当前地址为最近包裹的地址 t1.currentAddress = minPackage.address # 从packagesLoad中移除对应ID t1.packagesLoad.remove(min_package_id) # 更新卡车里程 t1.mileage += minValue
关键修改说明
- 获取Package对象:通过
myHash.lookup(pkg_id)将整数ID转换为对应的Package实例,确保pkg1能正常访问address等属性。 - 记录包裹ID:新增
min_package_id变量跟踪最近包裹的ID,因为packagesLoad存储的是ID集合,删除时需要用ID匹配列表中的元素。 - 修正删除操作:使用
list.remove(min_package_id)替换原有的del语句,避免因对象与ID不匹配导致的删除错误。
内容的提问来源于stack exchange,提问作者user24021390
相关产品推荐
相关产品推荐

