You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于另一列表区间为列表/序列/数组元素分配连续数值标签

高效实现基于区间的连续分组标签分配

核心思路

  1. 利用bisect模块快速定位每个元素在区间列表A中的所属区间索引,避免低效的逐一遍历。
  2. 对实际用到的区间分配连续的分组编号,确保标签序列连续无断层。

代码实现

import bisect

# 示例输入(替换为你的实际数据)
A = [1.0, 2.9, 3.4, 4.2, 5.5, 100.3]
B = [1.1, 1.2, 1.3, 2.5, 3.0, 3.1, 5.2]

# 确保区间列表A是升序排列(原始数据无序的话必须执行此步骤)
A.sort()

# 为每个B元素匹配对应的区间左边界索引
indices = []
for num in B:
    pos = bisect.bisect_left(A, num)
    if pos == 0:
        # 处理小于A最小值的异常值,可自定义逻辑
        indices.append(-1)
    elif pos == len(A):
        # 处理大于A最大值的异常值,可自定义逻辑
        indices.append(len(A))
    else:
        # 记录当前元素所属区间的左边界在A中的索引
        indices.append(pos - 1)

# 为出现过的区间分配连续分组编号
unique_indices = sorted(set(indices))
group_mapping = {idx: i+1 for i, idx in enumerate(unique_indices)}

# 生成最终标签列表
C = [f"group_{group_mapping[idx]}" for idx in indices]

print(C)

输出结果

['group_1', 'group_1', 'group_1', 'group_1', 'group_2', 'group_2', 'group_3']

关键说明

  • 效率保障:bisect_left操作是O(log n)时间复杂度,遍历B是O(m),整体处理大数据量(如百万级数据)时性能远优于手动区间匹配。
  • 边界处理:代码中对超出A范围的元素做了基础异常处理,你可以根据需求修改为抛出异常、分配统一异常标签等。
  • 排序要求:必须保证A是升序排列,否则bisect无法正确定位区间,原始数据无序时记得先执行A.sort()。

内容的提问来源于stack exchange,提问作者Jack Arkmount

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 10:25:41