Python嵌套列表按值范围筛选、记录索引及按索引取值方法
问题原因
你之前写的list_B = [i[a:b] for i in list_A]用的是列表切片逻辑,作用是截取每个子列表索引从a到b-1的元素,完全不是按元素值做区间筛选,所以得不到预期结果。
正确实现
首先定义基础数据和筛选阈值:
list_A = [[0.4,0.9,1,4,8],[9,2,3,7,8],[1,1.5,5,7,8],[5,6,10,2,3]] list_D = [[100,200,50,60,50],[5,20,30,45,50],[90,10,30,40,60],[30,40,50,20,10]] a = 1 b = 4
分步实现(可读性更好)
遍历每个子列表时同步收集符合区间要求的元素值、对应索引,不需要重复遍历两次:
list_B = [] list_C = [] for sub_list in list_A: valid_vals = [] valid_idxs = [] for idx, val in enumerate(sub_list): # 闭区间判断,包含两端端点 if a <= val <= b: valid_vals.append(val) valid_idxs.append(idx) list_B.append(valid_vals) list_C.append(valid_idxs) # 按list_C记录的索引从list_D取值生成list_E list_E = [] for sub_d, idxs in zip(list_D, list_C): list_E.append([sub_d[i] for i in idxs])
简洁列表推导写法
如果偏好更短的代码,可以直接用嵌套列表推导实现:
list_B = [[val for val in sub if a <= val <= b] for sub in list_A] list_C = [[idx for idx, val in enumerate(sub) if a <= val <= b] for sub in list_A] list_E = [[sub_d[i] for i in idxs] for sub_d, idxs in zip(list_D, list_C)]
运行结果说明
运行后输出结果如下:
list_B = [[1, 4], [2, 3], [1, 1.5], [2, 3]],完全符合需求给出的预期结构list_C = [[2, 3], [1, 2], [0, 1], [3, 4]]:你给出的示例里list_C第一个子列表[0,1]属于笔误,索引0、1对应的元素是0.4、0.9,不在[1,4]闭区间内,不符合筛选规则list_E = [[50, 60], [20, 30], [90, 10], [20, 10]]:除第一个子列表因索引笔误导致取值偏差外,其余三个子列表的结果和你给出的预期完全一致。
内容的提问来源于stack exchange,提问作者prob2050
相关产品推荐
相关产品推荐

