不使用defaultdict(list)实现嵌套元组按斜率聚合的问题
嵌套元组替代defaultdict实现同斜率点聚合方案
问题背景
我之前完成作业时,使用defaultdict(list)实现了同斜率点组合并的需求:输入两组点(Ax, Ay)和(Bx, By)计算斜率,将斜率相同的点组合并,原有实现代码如下:
dic = defaultdict(list) for elem in result: x1 = elem[0][0] y1 = elem[0][1] x2 = elem[1][0] y2 = elem[1][1] si = slope_intercept(x1, y1, x2, y2) temp = defaultdict(list) temp[si].append(elem) FullMergeDict(dic, temp) temp.clear()
现在要求弃用defaultdict(list),必须使用嵌套元组结构实现功能:
现有嵌套元组列表结构为(((1, 2), 3), (2, 5)),其中(1,2)为第一个坐标点、3为计算得到的斜率、(2,5)为第二个坐标点。
示例输入:
start = [(((1, 2), 3), (2, 5)), (((4, 5), 2), (3, 7)), (((2, 4), 1), (8, 9)), (((1, 2), 3), (4, 8))]
期望输出:
end = [((1, 2), (2, 5), (1, 2), (4, 8)), ((4, 5), (3, 7)), ((2, 4), (8, 9))]
转换规则:每个唯一斜率对应一个元组,聚合所有同斜率的坐标点,丢弃原结构中的斜率值,允许保留重复坐标。
实现方案
可以用普通字典暂存斜率到坐标集合的映射,最后统一转换为要求的元组结构即可,完全不需要依赖defaultdict:
# 初始化普通字典,key为斜率,value为存储坐标点的列表 slope_map = {} for item in start: # 解析当前元素的斜率和两个坐标点 (point1, slope), point2 = item # 斜率不存在则初始化空列表 if slope not in slope_map: slope_map[slope] = [] # 把两个坐标点追加到对应列表 slope_map[slope].extend([point1, point2]) # 把每个斜率对应的坐标列表转成元组,汇总得到最终结果 end = [tuple(points) for points in slope_map.values()]
运行后得到的end和要求的输出完全一致。如果要求全程严格仅使用元组存储中间结果,可将上述代码中的列表替换为元组拼接实现,性能会稍低但也能满足要求。
内容的提问来源于stack exchange,提问作者MarkS
相关产品推荐
相关产品推荐

