Python按组统计坐标移动转换次数的技术实现问询
一步步解决按组统计坐标转换次数的问题
很高兴看到你从毫无头绪到写出能运行的代码,咱们来把整个过程理清楚,也给你一些优化思路~
先明确核心需求
你需要处理每行格式为a,b,c的文件:
a无意义可以忽略b是坐标(范围1-117)c是组编号
最终要按组统计所有可能的坐标转换次数(从1→1到117→117,没出现的转换次数为0)。
比如你给出的示例输入:
23,20,789 25,7,789 29,7,789 32,20,789 0,2,870 3,40,870
组789的转换统计是:20→7(1次)、7→7(1次)、7→20(1次),其余全为0;组870则是2→40(1次),其余为0。
第一次代码的问题根源
你最初的代码出现重复统计输出的问题,是因为外层循环遍历了每一对连续的坐标,然后内层循环又去匹配所有相同的坐标对,导致同一个x→y转换会被多次输出(只要序列里出现多次这个转换,就会重复打印一次计数)。比如序列里有多个20→20,代码就会多次输出from 20 to 20 , result= 28242。
你的修改版为什么能解决问题
你修改后的思路完全正确!直接遍历所有可能的坐标组合(1到117的from和to),每个组合只统计一次、输出一次,从根源上避免了重复输出的问题。
不过可以给你优化一下代码的可读性和效率,比如如果你的原始文件是每行一个数据(不是同一组在一行),可以先按组把坐标序列提取出来,再统计:
优化后的完整代码
from collections import defaultdict # 第一步:按组分组,提取每个组的坐标序列 group_coords = defaultdict(list) with open("your_input_file.txt", "r") as input_file: for line in input_file: line = line.strip() if not line: # 跳过空行 continue # 拆分每行数据,忽略a,提取b(坐标)和c(组编号) _, coord_str, group_str = line.split(",") coord = int(coord_str) group_id = int(group_str) group_coords[group_id].append(coord) # 第二步:对每个组统计转换次数并写入结果 with open("count_results.txt", "w") as output_file: for group_id, coords in group_coords.items(): output_file.write(f"=== 组 {group_id} 转换统计 ===\n") # 初始化117x117的计数矩阵,默认值0(坐标1-117对应索引1-117) transition_counts = [[0] * 118 for _ in range(118)] # 遍历当前组的连续坐标对,统计次数 for i in range(len(coords) - 1): from_coord = coords[i] to_coord = coords[i+1] transition_counts[from_coord][to_coord] += 1 # 输出所有可能的转换对 for from_coord in range(1, 118): for to_coord in range(1, 118): output_file.write(f"from {from_coord} to {to_coord} , result= {transition_counts[from_coord][to_coord]}\n") output_file.write("\n")
这个优化版的优势:
- 自动处理所有组,不需要手动单组读取
- 用二维列表统计次数,比三层循环效率更高
- 代码结构更清晰,后续维护起来更方便
如果你还是习惯用你修改后的单组处理方式,也完全没问题,核心逻辑是对的~
内容的提问来源于stack exchange,提问作者Max.P
相关产品推荐
相关产品推荐

