Python中如何基于连续整数键值对字典列表进行分组
字典列表按连续整数值分组实现方案
需求说明
需要将元素为字典的列表,按照字典中取值为连续整数的键拆分分组,值为连续整数的字典归入同一个子列表。典型场景为NER识别结果的人名实体拆分:同一个人的名、中间名、姓对应的文本位置索引为连续整数,需要归为同一组。
输入示例
lst=[{'name':'sam','class':1}, {'name':'adam','class':2}, {'name':'smith','class':3}, {'name':'john','class':10}, {'name':'r.','class':11}, {'name':'doe','class':12} ]
期望输出
[[{'name':'sam','class':1}, {'name':'adam','class':2}, {'name':'smith','class':3}], [{'name':'john','class':10}, {'name':'r.','class':11}, {'name':'doe','class':12}] ]
实现代码
如果原始列表没有按照分组用的整数键排序,先执行排序(NER输出的实体一般已经按文本出现顺序排列,可跳过这步):
# 按class键升序排序,顺序确定的场景可注释掉这行 lst.sort(key=lambda x: x['class'])
核心分组逻辑:
grouped_result = [] current_group = [] last_val = None for item in lst: current_val = item['class'] # 初始化第一个分组,或遇到非连续值时新建分组 if last_val is None or current_val - last_val != 1: if current_group: grouped_result.append(current_group) current_group = [item] else: # 连续值加入当前分组 current_group.append(item) last_val = current_val # 追加最后一个未入结果的分组 if current_group: grouped_result.append(current_group)
运行后grouped_result就是符合要求的分组结果。
注意事项
- 排序步骤按需使用:如果数据源本身已经保证整数键按从小到大顺序排列,不需要额外排序,避免打乱原有实体顺序。
- 逻辑可扩展性强:如果后续分组的键名变更,只需要把代码里取
item['class']的部分换成对应的键名即可,不需要修改核心判断逻辑。 - 适配人名分组场景:NER输出的人名各部分(名、中间名、姓)在文本中连续出现,对应的位置索引差值为1,遇到其他类型实体或者下一个人名时索引会出现跳变,完全匹配该分组逻辑的判断条件。
内容的提问来源于stack exchange,提问作者steca
相关产品推荐
相关产品推荐

