Python中如何将CSV文件数据添加至自定义Hashtable中?
自定义Hashtable存入CSV数据故障排查与实现方案
常见问题根因
- Hashtable实例作用域错误
不要在CSV读取循环内重复初始化Hashtable实例,也不要在插入和查询场景下使用不同的实例。全局仅需初始化1次Hashtable,插入、查询共用同一个实例对象。
错误示例:
正确示例:for row in package_data: h = Hashtable() # 每次循环新建实例,之前插入的数据全部丢失 h.insert(row[0], row[1:])h = Hashtable() # 循环外初始化1次即可 for row in package_data: h.insert(row[0], row[1:]) - key类型不匹配
csv.reader读取到的所有字段默认都是字符串类型,如果你的Hashtable插入时用字符串类型作为key,查询时用整数类型作为key,就会触发==比对失败,返回None。
统一类型的实现示例(以将CSV第一列的包ID转为整数作为key为例):import csv h = Hashtable() with open('WGUPS.csv') as file: package_data = csv.reader(file, delimiter=',') for row in package_data: # 第一列转为整数作为key,剩余字段作为value key = int(row[0]) value = row[1:] h.insert(key, value) # 查询时也必须使用整数类型的key print(h.get(1)) # 正确 # print(h.get("1")) # 错误,类型不匹配会查询不到 - Hashtable初始化异常
确认你的Hashtable构造方法已经预生成了指定长度的空桶列表,如果self.table初始化时空长度为0,会导致取模运算异常,数据无法正确插入。
完整可运行的Hashtable实现参考:class Hashtable: def __init__(self, bucket_num=40): # 桶数量可根据CSV数据量调整 self.table = [[] for _ in range(bucket_num)] # 你的insert方法 def insert(self, key, value): bucket = hash(key) % len(self.table) bucket_list = self.table[bucket] for kv in bucket_list: if kv[0] == key: kv[1] = value return True bucket_list.append([key, value]) return True # 配套查询方法 def get(self, key): bucket = hash(key) % len(self.table) bucket_list = self.table[bucket] for kv in bucket_list: if kv[0] == key: return kv[1] return None # 只有查询不到时才会返回None
排查步骤
- 先脱离CSV测试Hashtable功能:手动调用
insert插入指定key、value,再调用get查询对应key,确认基础功能正常。 - 插入CSV数据时打印当前插入的key、value及对应类型,和后续查询时的key、类型做比对,确认完全一致。
- 打印插入完成后Hashtable的
self.table属性,确认桶列表中已经存在对应插入的键值对数据。
内容的提问来源于stack exchange,提问作者dkeys
相关产品推荐
相关产品推荐

