Python子列表修剪问题:提取至前10个唯一元素位置
修正子列表修剪逻辑:每个子列表独立统计前10个唯一元素
问题分析
现有列表normalized_result_lists包含多个子列表,需求是对每个子列表单独处理:识别该子列表的前10个唯一元素,然后将子列表修剪到第10个唯一元素出现的最后位置(保留该元素的所有出现项)。
原代码的核心问题:全局定义的unique_elements集合会在处理第一个子列表后积累满10个唯一元素,导致处理第二个子列表时,刚添加第一个元素就触发终止条件,最终得到错误的[1.0]结果。
修正后的代码
normalized_result_lists = [ [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0012468827930174, 1.0024937655860349, 1.0049875311720697, 1.0087281795511223, 1.0112219451371571, 1.0187032418952617, 1.0224438902743143, 1.0286783042394014, 1.0299251870324189, 2.0, 3.0], [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0013812154696133, 1.0013812154696133, 1.0055248618784531, 1.0055248618784531, 1.0055248618784531, 1.0096685082872927, 1.0138121546961325, 1.0179558011049723, 1.020718232044199, 1.0248618784530388, 1.031767955801105, 1.0414364640883977, 1.0524861878453038, 1.0607734806629834, 1.0662983425414365] ] trimmed_lists = [] for lst in normalized_result_lists: trimmed_list = [] # 每个子列表单独维护自己的唯一元素集合 unique_elements = set() for elem in lst: trimmed_list.append(elem) unique_elements.add(elem) if len(unique_elements) == 10: break trimmed_lists.append(trimmed_list) print(trimmed_lists)
关键修正点
- 将
unique_elements的定义移到子列表的循环内部,确保每个子列表都有独立的唯一元素统计集合,完全隔离不同子列表的数据。 - 其余逻辑保持不变:遍历子列表元素时,先添加到修剪后的列表,再将元素加入唯一集合,当集合大小达到10时终止当前子列表的遍历。
运行修正后的代码,会得到与预期完全一致的结果:第一个子列表保留到第10个唯一元素1.0299251870324189的位置;第二个子列表保留到第10个唯一元素1.020718232044199的位置。
内容的提问来源于stack exchange,提问作者Dbatt
相关产品推荐
相关产品推荐

