I was going to do something similar to `m_goldberg`, but since he has already done that, I'll add a version that uses an `Association` instead of assigning `DownValues`, which could be a problem if there are many assignments.

Our sample list:

    points = Transpose@{Range[0, 1, 0.1], RandomReal[{0, 1}, 11]}

> [![enter image description here][1]][1]

Then, we define the function `g` that assigns the values to `h`, which takes the form of an `Association`:

    Clear[h, g]
    h = Association[];
    g[x_] := Module[{}
      , AppendTo[h, x -> Association[]]
      ; Scan[
       If[
         0.5 x <= Last@# <= 0.5 (x + 1)
         , AppendTo[h[x], First@# -> 0.5 (x + 1)]
         ] &
       , points]
      ]

Then, for instance if we run `g[0.5]` and then `g[0.3]`, we get:

> [![enter image description here][2]][2]

`h` can *act* as a normal function despite being an `Association`. That is, let's suppose we're looking at the case where `x = 0.5`, and we're interested in a couple of values of `v`. Then

    h[0.5, 0.2]
    h[0.5, 0.1]
    (* 0.75 *)
    (* Missing["KeyAbsent", 0.1] *)

If you don't like the `Missing` behavior, we could always overload the function `h` in a clever way, or perhaps we could define a new function. We can even plot it:

    DiscretePlot[h[0.5, v], {v, 0, 1, 0.1}]

[![enter image description here][3]][3]


  [1]: https://i.sstatic.net/duLkJ.png
  [2]: https://i.sstatic.net/tsfIK.png
  [3]: https://i.sstatic.net/9XO2l.png