如何基于特定关键词删除列表重复行以整理RF测试报告
高效去重RF测试报告:保留同一Freq与Link Speed组合的最后一组结果
你提到之前通过列表索引删除重复行的方法不够高效,想要保留每个Freq. (MHz) + Link Speed组合的最后一组测试结果,覆盖之前的重复数据。我来给你一个更简洁通用的解决方案:
核心思路
我们可以用字典来跟踪每个(Freq. (MHz), Link Speed)组合最后一次出现的完整测试项组。因为每个组合对应的测试项是固定的(比如5行一组),我们先识别每个组的起始位置,再用字典记录最新的组,最后合并表头和所有最新组得到结果。
优化后的代码
list_1 = [['', '', 'Channel', 'Freq. (MHz)', 'Link Speed', 'Test Item', 'Lower Limit', 'Upper Limit', 'Measured', 'Unit', 'Status'], ['', '', '1', '2442', 'MCS6', 'Burst Power (Average)', '-100', '30', '12.09', 'dBm', 'PASS'], ['', '', '1', '2442', 'MCS6', 'EVM All Carriers (Average)', '', '-27', '-31.56', 'dB', 'PASS'], ['', '', '1', '2442', 'MCS6', 'EVM Data Carriers (Average)', '', '-27', '-31.45', 'dB', 'PASS'], ['', '', '1', '2442', 'MCS6', 'EVM Pilot Carriers (Average)', '', '-8', '-33.38', 'dB', 'PASS'], ['', '', '1', '2442', 'MCS6', 'Center Freq. Error (Average)', '-60300', '60300', '663.96', 'Hz', 'PASS'], ['', '', '1', '2412', 'MCS7', 'Burst Power (Average)', '-100', '30', '12.29', 'dBm', 'PASS'], ['', '', '1', '2412', 'MCS7', 'EVM All Carriers (Average)', '', '-27', '-31.16', 'dB', 'PASS'], ['', '', '1', '2412', 'MCS7', 'EVM Data Carriers (Average)', '', '-27', '-31.15', 'dB', 'PASS'], ['', '', '1', '2412', 'MCS7', 'EVM Pilot Carriers (Average)', '', '-8', '-33.18', 'dB', 'PASS'], ['', '', '1', '2412', 'MCS7', 'Center Freq. Error (Average)', '-60300', '60300', '663.16', 'Hz', 'PASS'], ['', '', '1', '2412', 'MCS7', 'Burst Power (Average)', '-100', '30', '12.09', 'dBm', 'PASS'], ['', '', '1', '2412', 'MCS7', 'EVM All Carriers (Average)', '', '-27', '-31.56', 'dB', 'PASS'], ['', '', '1', '2412', 'MCS7', 'EVM Data Carriers (Average)', '', '-27', '-31.45', 'dB', 'PASS'], ['', '', '1', '2412', 'MCS7', 'EVM Pilot Carriers (Average)', '', '-8', '-33.38', 'dB', 'PASS'], ['', '', '1', '2412', 'MCS7', 'Center Freq. Error (Average)', '-60300', '60300', '663.96', 'Hz', 'PASS'], ['', '', '1', '2412', 'MCS7', 'Burst Power (Average)', '-100', '30', '12.02', 'dBm', 'PASS'], ['', '', '1', '2412', 'MCS7', 'EVM All Carriers (Average)', '', '-27', '-32.08', 'dB', 'PASS'], ['', '', '1', '2412', 'MCS7', 'EVM Data Carriers (Average)', '', '-27', '-31.98', 'dB', 'PASS'], ['', '', '1', '2412', 'MCS7', 'EVM Pilot Carriers (Average)', '', '-8', '-33.56', 'dB', 'PASS'], ['', '', '1', '2412', 'MCS7', 'Center Freq. Error (Average)', '-60300', '60300', '763.52', 'Hz', 'PASS']] # 提取表头 header = list_1[0] # 确定每组测试项的行数(从第一个Burst Power到下一个的间隔) burst_indices = [i for i, row in enumerate(list_1) if row[5] == 'Burst Power (Average)'] group_size = burst_indices[1] - burst_indices[0] if len(burst_indices) > 1 else 1 # 用字典存储每个(Freq, Link Speed)组合的最后一组数据 latest_groups = {} for idx in burst_indices: freq = list_1[idx][3] link_speed = list_1[idx][4] # 提取当前组的所有行 current_group = list_1[idx:idx+group_size] # 更新字典,保留最后一组 latest_groups[(freq, link_speed)] = current_group # 合并表头和所有最新组 result = [header] for group in latest_groups.values(): result.extend(group) # 打印结果验证 for row in result: print(row)
代码解释
- 提取表头:单独拿出第一行作为结果的表头,避免处理测试数据时干扰表头内容。
- 动态确定组大小:通过找到所有
Burst Power (Average)的位置,计算出每个测试组合对应的行数(这里是5行),这个值是动态计算的,即使后续测试项数量变化也能适配。 - 跟踪最新组:遍历每个测试组的起始索引,用
(Freq. (MHz), Link Speed)作为字典的唯一键,每次遇到相同键时,用最新的组覆盖之前的记录,确保字典里最终只保留每个组合的最后一组数据。 - 生成最终结果:把表头和字典中存储的所有最新组合并,得到去重后的完整测试报告。
输出结果
运行代码后,会得到你期望的结果:
['', '', 'Channel', 'Freq. (MHz)', 'Link Speed', 'Test Item', 'Lower Limit', 'Upper Limit', 'Measured', 'Unit', 'Status'] ['', '', '1', '2442', 'MCS6', 'Burst Power (Average)', '-100', '30', '12.09', 'dBm', 'PASS'] ['', '', '1', '2442', 'MCS6', 'EVM All Carriers (Average)', '', '-27', '-31.56', 'dB', 'PASS'] ['', '', '1', '2442', 'MCS6', 'EVM Data Carriers (Average)', '', '-27', '-31.45', 'dB', 'PASS'] ['', '', '1', '2442', 'MCS6', 'EVM Pilot Carriers (Average)', '', '-8', '-33.38', 'dB', 'PASS'] ['', '', '1', '2442', 'MCS6', 'Center Freq. Error (Average)', '-60300', '60300', '663.96', 'Hz', 'PASS'] ['', '', '1', '2412', 'MCS7', 'Burst Power (Average)', '-100', '30', '12.02', 'dBm', 'PASS'] ['', '', '1', '2412', 'MCS7', 'EVM All Carriers (Average)', '', '-27', '-32.08', 'dB', 'PASS'] ['', '', '1', '2412', 'MCS7', 'EVM Data Carriers (Average)', '', '-27', '-31.98', 'dB', 'PASS'] ['', '', '1', '2412', 'MCS7', 'EVM Pilot Carriers (Average)', '', '-8', '-33.56', 'dB', 'PASS'] ['', '', '1', '2412', 'MCS7', 'Center Freq. Error (Average)', '-60300', '60300', '763.52', 'Hz', 'PASS']
这个方法比你之前的索引操作更灵活高效,字典的查找和更新都是O(1)的时间复杂度,整体只需遍历一次列表即可完成去重。
内容的提问来源于stack exchange,提问作者Alvin
相关产品推荐
相关产品推荐

