Python中如何优雅生成step切片的补集列表?求纯Python与numpy实现方案
高效实现方案
纯Python实现(优先推荐)
你原来的写法有两个核心问题:一是x not in B的成员查询时间复杂度为O(k)(k为B的长度),整体复杂度达到O(nk),大列表下性能极差;二是如果列表存在重复元素,会出现逻辑错误,把非切片位置的同值元素也错误过滤。
最优雅的纯Python方案直接通过索引判断筛选,时间复杂度仅为O(n),无额外查询开销:
单次遍历同时生成B、C(性能最优)
A = [0, 1, 2, 3, 4, 5, 6] step = 3 B = [] C = [] for idx, val in enumerate(A): if idx % step == 0: B.append(val) else: C.append(val) # 输出:B = [0,3,6], C = [1,2,4,5]
如果你的切片不是从索引0开始,比如取A[1::3],只需要把判断条件改为(idx - 1) % step == 0即可。
单独生成C的简化写法
如果已经确定了切片规则,不需要复用生成逻辑,可以直接用列表推导实现:
C = [val for idx, val in enumerate(A) if idx % 3 != 0]
Numpy实现(适合机器学习等大数据场景)
如果处理的是超大规模数据集,用numpy的向量化操作性能会远高于纯Python循环:
import numpy as np A = np.array([0, 1, 2, 3, 4, 5, 6]) step = 3 # 直接生成切片B B = A[::step] # 生成掩码过滤得到C mask = np.ones(len(A), dtype=bool) mask[::step] = False C = A[mask]
该方案所有运算均在numpy底层C接口执行,处理十万级以上长度的数组时性能提升可达几十上百倍。
内容的提问来源于stack exchange,提问作者jr15
相关产品推荐
相关产品推荐

