如何检查列表内是否存在与给定值在指定容差范围内的元素并实现符合条件的追加
实现方案
核心逻辑为:先设定邻域阈值(示例中为0.1),判断列表中是否存在和x的绝对差值小于等于阈值的元素,仅当不存在这类元素时,才将x追加到列表中。
小数据量场景实现
列表长度不大时,直接用Python内置all()函数实现即可,代码简洁易读:
def append_if_valid(y: list, x: float, threshold: float = 0.1) -> None: # 所有元素与x的差值都超出阈值范围时,才追加x if all(abs(num - x) > threshold for num in y): y.append(x) # 测试用例 y = [1, 1.5, 1.7, 2.1, 3] append_if_valid(y, 3.2) print(y) # 输出 [1, 1.5, 1.7, 2.1, 3, 3.2] append_if_valid(y, 3.05) print(y) # 输出仍为 [1, 1.5, 1.7, 2.1, 3, 3.2],3.05不会被追加
大数据量优化实现
如果列表长度很大,全量遍历的O(n)时间复杂度会影响性能,可维护一个有序列表,用二分查找仅判断x插入位置前后的两个元素即可,时间复杂度可降至O(logn):
import bisect def append_if_valid_sorted(y_sorted: list, x: float, threshold: float = 0.1) -> None: # 查找x的插入位置 insert_idx = bisect.bisect_left(y_sorted, x) # 检查左侧相邻元素 if insert_idx > 0 and abs(y_sorted[insert_idx - 1] - x) <= threshold: return # 检查右侧相邻元素 if insert_idx < len(y_sorted) and abs(y_sorted[insert_idx] - x) <= threshold: return # 无邻域元素,插入后保持列表有序 bisect.insort(y_sorted, x) # 测试用例 y_sorted = [1, 1.5, 1.7, 2.1, 3] append_if_valid_sorted(y_sorted, 3.2) print(y_sorted) # 输出 [1, 1.5, 1.7, 2.1, 3, 3.2] append_if_valid_sorted(y_sorted, 3.05) print(y_sorted) # 输出仍为 [1, 1.5, 1.7, 2.1, 3, 3.2]
内容的提问来源于stack exchange,提问作者Gabriele
相关产品推荐
相关产品推荐

