Python统计活动行数并更新BIDGROUP行第七列值的问题
需求与问题概述
- 输入为16列数据,需完成两个核心操作:
- 统计最终输出的总行数
- 找到包含
"BIDGROUP"的行,将其第7列(索引6)设置为输出总行数 - 1(例如输出6行时,该列值为5)
- 现有代码已实现将
"ADVANCED_TRIP"行拆分为多条"TRIP_ID"行,但统计并更新BIDGROUP行的逻辑不符合预期
输入示例
"131594", "", "BIDGROUP", 1, 0, 0, 2, "", 0:00, 0:00, 01JAN2009, 01JAN2009, 01JAN2009, 01JAN2009, false, 0, "131594", "AWARD", "UNTOUCHABLE", 1, 1, 0, 1, "", 0:00, 0:00, 10JUN2014, 13JUN2014 23:59, 01JAN2009, 01JAN2009, false, 100, "131594", "AWARD", "ADVANCED_TRIP", 1, 2, 0, 0, "740025Jun2014,705406Jun2014,737722Jun2014,696130Jun2014", 0:00, 0:00, 01JAN2009, 01JAN2009, 01JAN2009, 01JAN2009, false, 15,
预期输出示例
"131594", "", "BIDGROUP", 1, 0, 0, 5, "", 0:00, 0:00, 01JAN2009, 01JAN2009, 01JAN2009, 01JAN2009, false, 0, "131594", "AWARD", "UNTOUCHABLE", 1, 1, 0, 1, "", 0:00, 0:00, 10JUN2014, 13JUN2014 23:59, 01JAN2009, 01JAN2009, false, 100, "131594", "AWARD", "TRIP_ID", 1, 2, 0, 0, "7400", 0:00, 0:00, 25Jun2014, 01JAN2009, 01JAN2009, 01JAN2009, false, 15, "131594", "AWARD", "TRIP_ID", 1, 3, 0, 0, "7054", 0:00, 0:00, 06Jun2014, 01JAN2009, 01JAN2009, 01JAN2009, false, 15, "131594", "AWARD", "TRIP_ID", 1, 4, 0, 0, "7377", 0:00, 0:00, 22Jun2014, 01JAN2009, 01JAN2009, 01JAN2009, false, 15, "131594", "AWARD", "TRIP_ID", 1, 5, 0, 0, "6961", 0:00, 0:00, 30Jun2014, 01JAN2009, 01JAN2009, 01JAN2009, false, 15,
现有代码(无统计功能)
import sys import re lines = [] for line in sys.stdin: lines.append(line.strip()) output_lines = [] for line in lines: elements = line.split(", ") if elements[2] == '"ADVANCED_TRIP"': elements[2] = '"TRIP_ID"' trip_ids = elements[7].split(",") dates = re.findall(r'\d{2}[A-Za-z]{3}\d{4}', line) for i, (trip_id, date) in enumerate(zip(trip_ids, dates)): trip_id = trip_id.strip('"') output_line = elements[:7] + [f'"{trip_id[:4]}"'] + elements[8:] output_line[4] = str(int(output_line[4]) + i) output_line[10] = date output_lines.append(output_line) else: output_lines.append(elements) for output_line in output_lines: print(", ".join(output_line))
尝试统计的代码(逻辑未达预期)
import sys import re lines = [] for line in sys.stdin: lines.append(line.strip()) output_lines = [] total_activity_count = 0 trip_id_activity_count = 0 for line in lines: elements = line.split(", ") if elements[2] == '"BIDGROUP"': total_activity_count += 1 elements[6] = str(total_activity_count) output_lines.append(elements) elif elements[2] == '"ADVANCED_TRIP"': elements[2] = '"TRIP_ID"' trip_ids = elements[7].split(",") dates = re.findall(r'\d{2}[A-Za-z]{3}\d{4}', line) for i, (trip_id, date) in enumerate(zip(trip_ids, dates)): trip_id = trip_id.strip('"') output_line = elements[:7] + [f'"{trip_id[:4]}"'] + elements[8:] output_line[4] = str(int(output_line[4]) + i) output_line[10] = date output_lines.append(output_line) trip_id_activity_count += 1 else: output_lines.append(elements) total_activity_count += 1 for output_line in output_lines: print(", ".join(output_line))
解决方案
问题核心在于:原尝试代码在生成输出行时就修改BIDGROUP行,但此时还无法得知最终总行数。需先完整生成所有输出行,再统计总行数并更新BIDGROUP行。
修改后的代码如下:
import sys import re # 读取输入行 lines = [line.strip() for line in sys.stdin] output_lines = [] # 第一步:先完整生成所有输出行(暂不处理BIDGROUP的第7列) for line in lines: elements = line.split(", ") if elements[2] == '"ADVANCED_TRIP"': elements[2] = '"TRIP_ID"' trip_ids = elements[7].split(",") dates = re.findall(r'\d{2}[A-Za-z]{3}\d{4}', line) for i, (trip_id, date) in enumerate(zip(trip_ids, dates)): trip_id = trip_id.strip('"') output_line = elements[:7] + [f'"{trip_id[:4]}"'] + elements[8:] output_line[4] = str(int(output_line[4]) + i) output_line[10] = date output_lines.append(output_line) else: output_lines.append(elements) # 第二步:计算总行数,找到BIDGROUP行并更新第7列(索引6) total_rows = len(output_lines) target_value = total_rows - 1 for idx, line_elements in enumerate(output_lines): if line_elements[2] == '"BIDGROUP"': # 保留原有的引号格式 line_elements[6] = f'"{target_value}"' break # 假设仅存在一个BIDGROUP行,找到后终止遍历 # 第三步:输出最终结果 for line_elements in output_lines: print(", ".join(line_elements))
关键修改点说明
- 分阶段执行:先完成所有输出行的生成(含
ADVANCED_TRIP拆分),确保能准确获取最终总行数 - 延迟更新BIDGROUP行:拿到总行数后,再遍历输出行找到
"BIDGROUP"行,将其第7列设置为总行数-1,同时保留原有的引号格式 - 简化计数逻辑:直接通过
len(output_lines)获取总行数,无需维护额外计数变量,避免人工计数错误
内容的提问来源于stack exchange,提问作者FluctLigth
相关产品推荐
相关产品推荐

