Filtering list from a list

I have two lists: one containing a list of tuples (numbers) and the other the list of numbers. For instance, L = [(2,3),(5,6), (4,6),…] and E = [2,5,7,3…]. Now, are there any other better ways to do similar to the following?

V = [filter(x->x[1]== e, L) for e in E]

Thanks in advance.

The desired result is not well defined in your example. Your version produces empty tuples or doubled entries in the result depending on values in L and E.
Here are two variants:

filter( x -> x[1] in E, L)

But depending on you data and size this may be much slower as your version.
If E can be sorted there is also:

filter( x -> insorted(x[1],E), L)

which will be much faster if E is sorted.

The best solution depends on what you really want as a result and the sizes of L and E.

using SplitApplyCombine

group(t->first(t) ∈ Set(E), L)[true]

#or

groupview(t->first(t) ∈ Set(E) ,L)[true]


#or

[e for e in L if first(e) ∈ Set(E)]
using SplitApplyCombine

(D -> [haskey(D,e) ? D[e] : similar(L,0) for e in E])(group(first, L))

gives exactly same result as OP (thanks to cute group function @rocco_sprmnt21 mentioned).

Yeah, it looks worse than OP expression, but possibly lower time complexity (and higher space complexity).

You can use filter directly like this. There is no need for comprehension.

L = [(2,3), (5,6), (4,6)]; 
E = [2,5,7,3];

filter(x->first(x) in E, L)
2-element Vector{Tuple{Int64, Int64}}:
 (2, 3)
 (5, 6)