result = [area for x,y in zip(heights,widths) if (area := to_area(x,y)) > 10]
I don't think that's very easy to read; I'd opt for two list comps like areas = [to_area(x,y) for x,y in zip(heights,widths)]
result = [area for area in areas if area > 10]
But I agree with OP that map+filter is easier to read.