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
相关产品推荐
相关产品推荐

