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

Python优雅实现:基于另一列表区间对列表元素分组

Python 简洁实现区间分组(无多层嵌套循环)

给定两个列表:

List_A = [1, 25, 40]
List_B = [2, 19, 23, 26, 30, 32, 34, 36]

需要将List_B中的元素按List_A划分的区间([1,25)、[25,40))分组,得到结果[[2,19,23], [26,30,32,34,36]]。以下是两种无需手动编写多层嵌套循环的简洁实现方式:

方法一:bisect + itertools.groupby

利用bisect模块快速定位元素所属区间,结合itertools.groupby完成分组,适用于原生Python环境:

import bisect
from itertools import groupby

List_A = [1, 25, 40]
List_B = [2, 19, 23, 26, 30, 32, 34, 36]

groups = []
# 用bisect_left获取元素在List_A中的插入位置,减1得到区间索引作为分组键
for key, group in groupby(List_B, lambda x: bisect.bisect_left(List_A, x) - 1):
    groups.append(list(group))

print(groups)  # 输出: [[2, 19, 23], [26, 30, 32, 34, 36]]

原理:bisect_left(List_A, x)返回x应插入List_A的位置,比如x=23返回1,减1后对应第一个区间;x=26返回2,减1后对应第二个区间。groupby会自动按此键将同区间元素归为一组。

方法二:numpy.digitize

如果项目中已使用numpy,这种方式更直观简洁:

import numpy as np

List_A = [1, 25, 40]
List_B = [2, 19, 23, 26, 30, 32, 34, 36]

# 获取每个元素对应的区间索引
indices = np.digitize(List_B, List_A) - 1
# 按索引筛选元素并分组
groups = [List_B[indices == i].tolist() for i in range(len(List_A)-1)]

print(groups)  # 输出: [[2, 19, 23], [26, 30, 32, 34, 36]]

原理:np.digitize直接返回每个元素所属区间的右边界索引,减1后得到分组索引,再通过布尔索引提取对应区间的元素。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 23:22:14