代码之家  ›  专栏  ›  技术社区  ›  Jared

比较列表中的元组元素

  •  -3
  • Jared  · 技术社区  · 2 年前

    我有两个包含质心坐标元组的列表。。。

    current_centroids = [(924, 849), (734, 974), (360, 778), (400, 710), (963, 1067), (839, 440), (899, 88)]
    prior_centroids = [(1096, 837), (522, 763), (898, 960), (563, 694), (1790, 720), (1080, 75), (1780, 713)]
    

    我想基于比较中每个元组的第二个元素来生成成对的元组 current_centroids 中每个元组的第二个元素 prior_centroids 以及找到在第二元素之间具有最小绝对差的结果对。

    例如,对于 (924, 849) 在里面 电流中心 ,的元组 先验_中心 其中当比较第二元素时最小绝对差(=12)为 (1096, 837) 。我一直在尝试使用列表理解来解决这个问题,这样我就可以生成格式为的最终列表 [((924, 849), (1096, 837)), .....] 。我不使用 zip 因为每个列表中的元素并不对应,它们可以有不同数量的元素,即使在我的示例中它们的大小相同。

    2 回复  |  直到 2 年前
        1
  •  1
  •   Barmar    2 年前

    循环 current_centroids 。对于每个元素,使用 min() 查找的元素 prior_centroids 它们之间的最小绝对差 [1] 价值观

    result = []
    for c1 in current_centroids:
        c2 = min(prior_centroids, key=lambda c: abs(c1[1] - c[1]))
        result.append((c1, c2))
    

    样本输入的结果:

    [((924, 849), (1096, 837)),
     ((734, 974), (898, 960)),
     ((360, 778), (522, 763)),
     ((400, 710), (1780, 713)),
     ((963, 1067), (898, 960)),
     ((839, 440), (563, 694)),
     ((899, 88), (1080, 75))]
    
        2
  •  0
  •   Jared    2 年前

    我将Barmar的答案转换为列表理解:

    result = [(c1, min(prior_centroids, key = lambda c: abs(c1[1] - c[1]))) for c1 in current_centroids]