Python遍历二维列表按条件删除元素或行并导出异常分数的实现问题
问题根源拆解
- 负分检测失效的核心原因:
str.isdigit()方法仅能识别无符号的数字字符,对带负号的字符串(如'-65')会直接返回False,根本不会进入后续的数值比对逻辑,所以所有负分异常都被漏检。 - 仅能删除首个异常行的核心原因:遍历列表的过程中直接对原列表执行删除操作,会造成索引错位——删除当前位置的元素后,后续元素会自动前移补位,但遍历指针仍按原索引顺序推进,直接跳过相邻的待处理元素,必须反复运行才能逐次删完所有命中行。
- 单元素删除方案报错的核心原因:
newArray.remove(col)的调用逻辑不匹配——col是嵌套在行内的分数值,而remove()方法仅能匹配列表顶层的元素,根本无法定位到嵌套的分数值,自然触发找不到元素的报错。
场景1:删除包含异常分数的整行
采用边遍历边收集合规行的逻辑,全程不修改原列表,从根源上避免索引错位问题;用int()直接做类型转换替代isdigit(),兼容带负号的数字字符串,不会漏检负分。
newArray = [['joe bloggs', '45', '46', '52', '83'], ['bobby uncle', '52', '45', '85', '63'], ['luke van', '69', '48', '45', '22'], ['lauren loo', '75', '24', '-65', '32'], ['heidi ho', '65', '7', '58', '14'], ['robyn cook', '23', '24', '51', '63'], ['cath roberts', '56', '85', '14', '74'], ['june jules', '58', '45', '26', '65'], ['dan nissie', '41', '56', '85', '45'], ['chris cooks', '24', '-15', '25', '75'], ['Kate Vander', '105', '23', '67', '1'], ['Luther rose', '55', '25', '207', '45']] valid_rows = [] error_scores = [] # 收集所有命中的异常分数,用于写入txt for row in newArray: row_is_valid = True # 跳过第一列的姓名,从第二列开始遍历分数 for score_str in row[1:]: try: score = int(score_str) if score < 0 or score > 100: error_scores.append(score_str) row_is_valid = False # 遇到无法转成整数的内容直接跳过,不影响行判定 except ValueError: continue if row_is_valid: valid_rows.append(row) # 一次性写入异常分数到txt文件 with open("error_records.txt", "w", encoding="utf-8") as e: e.write(",".join(error_scores)) # 用处理完成的合规列表替换原数组 newArray = valid_rows
运行后得到的结果和预期的删行输出完全一致,不需要反复运行就能一次性删除所有含异常分的行,也能正常识别所有负分异常。
场景2:仅删除行内的单个异常分数
逐行过滤出符合范围的分数,保留行的整体结构和姓名信息,同时同步收集被删除的异常分数用于记录。
newArray = [['joe bloggs', '45', '46', '52', '83'], ['bobby uncle', '52', '45', '85', '63'], ['luke van', '69', '48', '45', '22'], ['lauren loo', '75', '24', '-65', '32'], ['heidi ho', '65', '7', '58', '14'], ['robyn cook', '23', '24', '51', '63'], ['cath roberts', '56', '85', '14', '74'], ['june jules', '58', '45', '26', '65'], ['dan nissie', '41', '56', '85', '45'], ['chris cooks', '24', '-15', '25', '75'], ['Kate Vander', '105', '23', '67', '1'], ['Luther rose', '55', '25', '207', '45']] processed_array = [] error_scores = [] for row in newArray: name = row[0] valid_scores = [] for score_str in row[1:]: try: score = int(score_str) if 0 <= score <= 100: valid_scores.append(score_str) else: error_scores.append(score_str) except ValueError: valid_scores.append(score_str) # 重新拼接成带姓名的行结构 processed_array.append([name] + valid_scores) # 写入异常分数到txt with open("error_records.txt", "w", encoding="utf-8") as e: e.write(",".join(error_scores)) newArray = processed_array
运行后的结果和预期的单元素删除输出完全匹配。
内容的提问来源于stack exchange,提问作者EL.M
相关产品推荐
相关产品推荐

