Python ATM交易日志搜索函数问题:类型错误与匹配失败求助
问题修复方案
先梳理你的代码核心错误,再给出修复后的完整代码:
核心错误点
- 行数获取逻辑错误:
rows = len(str(array))是把二维列表转成字符串后取长度,完全不是你需要的记录行数,应该直接遍历原二维列表array。 - 遍历对象错误:之前遍历
rows(整数类型)导致TypeError,正确操作是遍历array里的每一条交易记录。 - 结果收集错误:
search_result = array.append(str(elem))中,append是原地修改列表,返回值为None,且你应该把整条匹配的记录加入search_result,而非单个字段。 - 匹配逻辑错误:每个
if分支未处理字段与记录索引的对应关系,比如"id"对应每条记录的第0个元素,原代码直接拿错误的遍历对象去比较,完全不符合需求。 - 打印时机错误:原逻辑每循环一次不匹配就打印"未找到",正确做法是收集完所有匹配记录后,判断结果为空再提示。
- 代码冗余:三个
if分支逻辑重复,可通过字段映射简化。
修复后的完整代码
def search_records(array, search_field, search_value): search_result = [] # 映射搜索字段到二维列表的索引 field_index = { "id": 0, "account": 1, "operation": 2 } # 校验搜索字段合法性 if search_field not in field_index: print(f"无效的搜索字段:{search_field}") return target_index = field_index[search_field] # 遍历所有交易记录 for record in array: # 统一类型后比较,避免数字与字符串不匹配问题 if str(record[target_index]) == str(search_value): search_result.append(record) # 打印结果 if search_result: # 根据搜索字段生成对应标题 title_map = { "id": f"ATM ID: {search_value}", "account": f"账号: {search_value}", "operation": f"操作类型: {search_value}" } print(f"匹配{title_map[search_field]}的记录:") print(" ") print("ATM ID : 账号 : 操作类型 : 金额") print("---------------------------------------") for elem in search_result: # 用ljust简化对齐逻辑 atm_id = str(elem[0]).ljust(8) account = str(elem[1]).ljust(10) operation = str(elem[2]).ljust(7) amount = str(elem[3]).ljust(3) print(f"{atm_id}: {account}: {operation}: {amount}") else: tip_map = { "id": f"ATM ID: {search_value}", "account": f"账号: {search_value}", "operation": f"操作类型: {search_value}" } print(f"未找到匹配{tip_map[search_field]}的记录")
代码说明
- 用
field_index字典关联搜索字段与记录索引,消除重复代码 - 统一转换类型后比较,避免数字与字符串类型不匹配导致的漏匹配
- 先收集所有匹配记录再统一打印,避免错误提示频繁输出
- 用
ljust()方法简化对齐逻辑,替代手动计算空格的繁琐操作 - 增加非法字段校验,提升函数容错性
内容的提问来源于stack exchange,提问作者Loree
相关产品推荐
相关产品推荐

