Python按相邻间距条件循环拆分字典键为嵌套子列表
问题描述
我编写了一段生成字典的代码:
result = {6: 4, 12: 5, 17: 4, 23: 5, 28: 4, 36: 7, 37: 0, 46: 8, 52: 5, 57: 4, 62: 4, 89: 26, 113: 23, 134: 20, 136: 1, 149: 12, 161: 11, 173: 11, 175: 1, 178: 2, 201: 22, 202: 0, 209: 6}
该字典的键代表位置,值为对应字符间的间距。
需要筛选间距在0到9之间的条目,将所有间距满足0-9的连续位置段输出为独立子列表:遍历所有字典键,检查当前键与后续相邻键的间距,若间距在0-9区间则将对应键加入当前列表;若下一组间距大于9,则结束当前列表,新建列表重新开始检测。
目前已实现基础筛选功能,但无法生成嵌套列表结构,现有代码如下:
temp = [] jmax = 0 jmin = 9 for i in range(0, len(result.keys())): j = i+1 if j < len(result.keys()): key1 = list(result.keys())[i] key2 = list(result.keys())[j] var1 = key2 - key1 if 0 <= var1 <= 9: temp.append(key1) if key1 not in temp else temp temp.append(key2) if key2 not in temp else temp print (temp)
期望输出结果:
[[6, 12, 17, 23, 28, 36, 37, 46, 52, 57, 62], [134, 136], [173, 175, 178], [201, 202, 209]]
解决方案
原代码存在三个核心问题:
- 循环内反复将字典键转为列表,执行效率低
- 仅维护单个扁平列表存储结果,没有设计分段存储逻辑,遇到间距大于9的断点时无法切分子列表
- 循环结束后没有处理最后一段连续数据,容易漏项
直接使用以下代码即可实现需求:
# 提前提取键列表,Python3.7及以上版本字典默认保留键的插入顺序,原始字典键本身为升序排列 keys = list(result.keys()) res = [] if keys: # 初始化第一个连续段,放入第一个键 current_segment = [keys[0]] # 从第二个键开始遍历比对 for idx in range(1, len(keys)): prev_k = keys[idx-1] curr_k = keys[idx] gap = curr_k - prev_k if 0 <= gap <= 9: # 间距符合要求,加入当前连续段 current_segment.append(curr_k) else: # 间距不符合要求,若当前段长度≥2说明是有效连续段,存入结果 if len(current_segment) >= 2: res.append(current_segment) # 重置当前段,放入当前键开始新段检测 current_segment = [curr_k] # 循环结束后补上最后一段有效连续数据 if len(current_segment) >= 2: res.append(current_segment) print(res)
运行后输出结果和期望完全一致。
代码中
len(current_segment) >= 2的判断用于过滤孤立的单个键(这类键和前后位置的间距都大于9,不属于连续位置段),如果后续需要将单个孤立键也作为独立子列表输出,删除该长度判断即可。
内容的提问来源于stack exchange,提问作者Alexandre P Magalhães
相关产品推荐
相关产品推荐

