Python for循环中处理非数字元素并匹配数值区间的实现方法
问题根因
你当前的循环嵌套层级搞反了:把遍历new_to_csv业务数据的循环,放在了读取table_x映射规则的循环内部。每读取一行映射规则,就会遍历一遍所有new_to_csv的记录,对于非数字开头的记录,不管当前规则内容是什么,都会触发追加逻辑,最终table_x有多少行规则,非数字记录就会被重复追加多少次。
修正思路
- 先一次性读取所有
table_x的映射规则,存储到独立列表,读取规则的阶段不处理业务数据 - 外层循环直接遍历
new_to_csv的每一条记录,每条记录仅处理一次 - 单条记录处理逻辑:
- 首字段不是纯数字:直接追加固定标识,无需遍历规则
- 首字段是纯数字:再遍历规则列表匹配对应区间,匹配成功后追加对应属性即可
修正后可运行代码
import csv # 第一步:读取所有区间映射规则,独立存储 rule_list = [] table_x_path = r"C:\Users\ELK\Downloads\table_x.txt" with open(table_x_path, "r", encoding="utf-8") as f: reader = csv.reader(f, delimiter="\t") # 跳过前4行表头 for _ in range(4): next(reader) for row in reader: # 跳过空行 if len(row) < 3: continue min_val = int(row[1]) max_val = int(row[2]) # 提取3:9列属性(Python切片左闭右开,对应需求的3:8列范围) attrs = row[3:9] rule_list.append((min_val, max_val, attrs)) # 第二步:逐条处理new_to_csv的记录 result_list = [] for record in new_to_csv: head_val = record[0] # 非数字直接加固定标识,对齐预期字段数 if not head_val.isdigit(): result_list.append(record + ["Unkown", "Unkown", "", "Unkown"]) continue # 数字匹配规则 num = int(head_val) for min_val, max_val, attrs in rule_list: if min_val < num < max_val: result_list.append(record + attrs) break # 匹配成功即退出,避免重复匹配 print(result_list)
额外调整说明
- 若需要区间包含边界值(例如99刚好属于1-99区间),可将判断条件改为
min_val <= num <= max_val - 读取文件时增加了
encoding参数,避免不同系统下的编码报错 - 原代码中非数字分支错误引用了规则行的
row字段,修正后非数字场景完全不依赖规则内容,直接输出固定标识
内容的提问来源于stack exchange,提问作者TangerCity
相关产品推荐
相关产品推荐

