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

不使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 21:45:02