code: def distance_function_match(l1, l2, thresh, dist_fn, norm_funcs=[]):
      common = []
      l1 = list(enumerate(l1))
      l2 = list(enumerate(l2))
      for norm_fn in norm_funcs:
          new_common, l1, l2 = _match_by_norm_func(
                  l1, l2,
                  lambda a: norm_fn(a[1]),
                  lambda a1, a2: dist_fn(a1[1], a2[1]),
                  thresh)
          common.extend((c1[0], c2[0]) for c1, c2 in new_common)
      dist_matrix = [[dist_fn(e1, e2) for i2, e2 in l2] for i1, e1 in l1]
      components = BipartiteConnectedComponents()
      for l1_i in range(len(l1)):
          for l2_i in range(len(l2)):
              if dist_matrix[l1_i][l2_i] > thresh:
                  continue
              components.add_edge(l1_i, l2_i)
      for l1_indices, l2_indices in components.get_connected_components():
          part_l1 = [l1[i] for i in l1_indices]
          part_l2 = [l2[i] for i in l2_indices]
          part_dist_matrix = [[dist_matrix[l1_i][l2_i] for l2_i in l2_indices]
                              for l1_i in l1_indices]
          part_cmn = _match_munkres(part_l1, part_l2, part_dist_matrix, thresh)
          common.extend((c1[0], c2[0]) for c1, c2 in part_cmn)
      return common