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

如何基于索引快速从三元组列表生成仅含前两元素的子列表?

高效实现基于z值筛选并提取(x,y)的方案

要高效解决这个问题,核心思路是用空间换时间——先把list1里的三元组转换成「z值→(x,y)」的映射字典,这样后续的查找操作就能从线性遍历变成O(1)的直接取值,尤其当list1的规模很大时,效率提升会非常显著。

具体步骤:

  1. 构建z值到(x,y)的映射字典
    利用字典推导式,一次性把list1中的所有元素转换成键值对,键是z值,值是对应的(x,y)元组:

    list1 = [(1250, 1442, 0), (1280, 1655, 1), (1029, 1680, 2), (624, 1573, 3), (732, 1159, 4), (1530, 1634, 5), (1885, 1628, 6), (2152, 1834, 7), (1252, 2459, 8), (1309, 3023, 9), (1376, 3585, 10), (1571, 2388, 11), (1682, 2952, 12), (1686, 3579, 13), (1184, 1391, 14), (1291, 1382, 15), (1117, 1440, 16), (1361, 1400, 17)]
    z_to_xy = {z: (x, y) for x, y, z in list1}
    
  2. 根据目标z值列表生成新列表
    用列表推导式遍历list2、list3、list4,直接从字典中取出对应的(x,y)即可,这一步的时间复杂度是O(k)(k是每个目标列表的长度):

    list2 = [0,1,14,15,16,17]
    list3 = [2,3,4,5,6,7,8,11]
    list4 = [9,10,12,13]
    
    # 生成list5
    list5 = [z_to_xy[z] for z in list2]
    # 生成list6
    list6 = [z_to_xy[z] for z in list3]
    # 生成list7
    list7 = [z_to_xy[z] for z in list4]
    

效率对比:

  • 如果你用最直观的线性筛选方式(比如[(x,y) for x,y,z in list1 if z in list2]),每次判断z in list2的时间是O(k),整体时间复杂度是O(N*k)(N是list1的长度)。
  • 而用字典映射的方式,构建字典的时间是O(N),后续生成每个目标列表的时间是O(k),整体时间复杂度是O(N + k1 + k2 + k3),当N很大时,这种方法的效率会远高于线性筛选。

验证结果:

运行上述代码后,list5的结果正好和你给出的示例一致:
[(1250, 1442), (1280, 1655), (1184, 1391), (1291, 1382), (1117, 1440), (1361, 1400)]

内容的提问来源于stack exchange,提问作者the_guy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:20:50