合并连续同标签元组列表元素时缺失最后子列表的问题排查
问题:合并连续相同标签的时间戳列表
输入与需求
输入的子列表(可视为元组)如下:
[['PS', 0], ['PS', 71.43], ['PS', 142.86], ['tut', 37071.43], ['tut', 59000.0], ['PS', 59071.43], ['PS', 61500.0]]
每个子元素包含分段标签和时间戳。需求是将连续拥有相同标签的时间戳归入同一个子列表,并在子列表末尾添加格式为[该组最后一个时间戳, 标签]的元素。
预期输出(注:原预期输出中[37000.0, "PS"]应为笔误,正确应为[142.86, "PS"]):
[[0.0, 71.43, 142.86, [142.86, "PS"]], [37071.43, 59000.0, [59000.0, "tut"]], [59071.43, 61500.0, [61500.0, "PS"]]]
现有问题
当前实现代码输出缺失了最后一组的时间戳59071.43,实际输出:
[['PS', 0], ['PS', 71.43], ['PS', 142.86], ['tut', 37071.43], ['tut', 59000.0], ['PS', 61500.0]]
原实现代码:
def same_sec(tuple_list): one_tuple = [] #sublist sec_list= [] #list of sublists print(len(tuple_list)) for i in range(len(tuple_list)): #assuming last element always belongs to the last group of section ids if i == len(tuple_list) - 1: #add the last element sec_list[-1].append([tuple_list[i][0],tuple_list[i][1]]) #if two consecutive labels are the same add it to sublist elif (tuple_list[i][0] == tuple_list[i+1][0]): one_tuple.append(tuple_list[i][1]) #if next label is different add current element to sublist and add sublist to list else: one_tuple.append([tuple_list[i][0],tuple_list[i][1]]) sec_list.append(one_tuple) one_tuple = [] #reset sublist return sec_list
问题分析
- 最后元素处理逻辑错误:直接往
sec_list[-1]追加,但如果最后一组还未被加入sec_list,会引发索引错误,且未将当前分组的时间戳完整加入。 - 分组逻辑混乱:连续标签相同时仅追加当前时间戳,但未处理分组收尾;不同标签时追加的格式不符合需求。
- 遗漏最后分组:循环结束后未主动处理最后一个分组,导致部分元素丢失。
修正后的代码
def same_sec(tuple_list): # 处理空列表的边界情况 if not tuple_list: return [] sec_list = [] # 初始化当前分组的标签和时间戳列表 current_label = tuple_list[0][0] current_timestamps = [tuple_list[0][1]] # 从第二个元素开始遍历 for label, timestamp in tuple_list[1:]: if label == current_label: # 相同标签,追加时间戳 current_timestamps.append(timestamp) else: # 不同标签,收尾当前分组并加入结果 current_timestamps.append([current_timestamps[-1], current_label]) sec_list.append(current_timestamps) # 初始化新分组 current_label = label current_timestamps = [timestamp] # 处理最后一个未收尾的分组 current_timestamps.append([current_timestamps[-1], current_label]) sec_list.append(current_timestamps) return sec_list
测试验证
输入测试代码:
input_list = [['PS', 0], ['PS', 71.43], ['PS', 142.86], ['tut', 37071.43], ['tut', 59000.0], ['PS', 59071.43], ['PS', 61500.0]] print(same_sec(input_list))
输出结果:
[[0, 71.43, 142.86, [142.86, 'PS']], [37071.43, 59000.0, [59000.0, 'tut']], [59071.43, 61500.0, [61500.0, 'PS']]]
内容的提问来源于stack exchange,提问作者Béla
相关产品推荐
相关产品推荐

