Short answer:
dict(zip(x, [[n_y for n_y in y if n_y < n_x] for n_x in x]))
Long answer
First we need to iterate over y to check which element is smaller than something. If we do it in 10, we get the following:
>>> [n_y for n_y in y if n_y < 10] [1, 2, 3]
Then we need to make the '10' variable look cast x:
>>> [[n_y for n_y in y if n_y < n_x] for n_x in x] [[1, 2, 3], [1, 2, 3, 15], [1, 2, 3, 15, 22, 27]]
Finally, we need to add these results with the original x. Here, when zip comes in handy:
>>> zip(x, [[n_y for n_y in y if n_y < n_x] for n_x in x]) [(10, [1, 2, 3]), (20, [1, 2, 3, 15]), (30, [1, 2, 3, 15, 22, 27])]
This gives a list of tuples, so we have to put a dict on it to get the final result:
>>> dict(zip(x, [[n_y for n_y in y if n_y < n_x] for n_x in x])) {10: [1, 2, 3], 20: [1, 2, 3, 15], 30: [1, 2, 3, 15, 22, 27]}