Python:按条件筛选元素时保留列表结构并追踪来源
保留原列表结构的NumPy数组筛选实现
首先是原列表l6的创建代码:
import numpy as np l1 = np.ones(10) l2 = 10*np.ones(9) l3 = 9*np.ones(9) l4 = 2*np.ones(1034) l5 = np.array([1, 2, 8, 1350, 1, 14, 13, 1467416, 1413, 135, 1, 3 , 9, 8, 9, 10]) l6 = [l1, l2, l3, l4, l5]
原代码会将所有符合条件的元素收集到扁平列表,现在需要保留与l6一致的5元素列表结构:
- 索引0、2、3的位置用空列表或0填充
- 索引1、4的位置存入对应子数组中值大于9的元素,同时明确元素来源
实现方案
通过遍历l6的每个元素,结合索引判断处理,以下是两种常用方案:
方案1:空列表填充无效位置,元组标注来源
result = [] for idx, arr in enumerate(l6): # 用NumPy布尔索引快速筛选符合条件的元素 filtered = arr[arr > 9].tolist() if filtered: # 用元组绑定来源标识和筛选结果 result.append((f"来源:l6[{idx}]", filtered)) else: # 无符合条件元素时填充空列表 result.append([])
执行后result的结构:
result[0]:空列表(l1全为1,不满足条件)result[1]:('来源:l6[1]', [10.0, 10.0, ...])(共9个10.0)result[2]:空列表(l3全为9,不满足条件)result[3]:空列表(l4全为2,不满足条件)result[4]:('来源:l6[4]', [1350, 14, 13, 1467416, 1413, 135, 10])
方案2:0填充无效位置,字典存储有效结果
如果需要用0替代空列表,可改用字典存储有效数据,来源标识更清晰:
result = [] for idx, arr in enumerate(l6): filtered = arr[arr > 9].tolist() if filtered: result.append({ "来源位置": f"l6[{idx}]", "符合条件元素": filtered }) else: result.append(0)
关键细节
- 利用NumPy布尔索引
arr[arr > 9]比嵌套for循环筛选效率更高 - 通过
enumerate获取子数组的索引,直接关联元素来源 - 两种填充方式都严格保留了原列表的5元素结构,完全匹配需求
内容的提问来源于stack exchange,提问作者Raz
相关产品推荐
相关产品推荐

