If you just want all elements that are in one list and not in another, I would suggest looking into python set
s. They don't allow for duplicates, but the performance and readability benefits are large.
You would implement this like so:
newlist = list(set(list1).difference(set(list2)))
If you want to apply this in place of your current solutions, you should do something along the lines of what Dominic suggested (slightly edited for readability):
[list(set(a)-set(b)) for a, b in zip(list1, list2)]
If the order matters, or you have duplicates, then the single list comprehension you had above should do the trick, just wrap it as a lambda function to make it more readable:
single_item = lambda i: [y for y in list1[i] if y not in list2[i]]
newlist = [single_item(i) for i in enumerate(list1)]