Define efficient. Anyway here's what I would do. If it was too slow I'd probably move it to Cython.
s1 = set(l1)
s2 = set(d1.keys())
s3 = s1 & s2
# now you can access d1 using only keys in s3, or construct a new dict if you like
d2 = dict([(k,d1[k]) for k in s3])