I want to compare 2 iterables and print the items which appear in both iterables.

``````>>> a = ('q', 'r')
>>> b = ('q')

# Iterate over a. If y not in b, print y.
# I want to see ['r'] printed.
>>> print([ y if y not in b for y in a])
^
``````

But it gives me a invalid syntax error where the `^` has been placed.

You got the order wrong. The `if` should be after the `for` (unless it is in an `if-else` ternary operator)

``````[y for y in a if y not in b]
``````

This would work however:

``````[y if y not in b else other_value for y in a]
``````

You put the `if` at the end:

``````[y for y in a if y not in b]
``````

List comprehensions are written in the same order as their nested full-specified counterparts, essentially the above statement translates to:

``````outputlist = []
for y in a:
if y not in b:
outputlist.append(y)
``````

``````outputlist = []
if y not in b:
for y in a:
outputlist.append(y)
``````

but a list comprehension must start with at least one outer loop.

list comprehension formula:

``````[<value_when_condition_true> if <condition> else <value_when_condition_false> for value in list_name]
``````

thus you can do it like this:

``````[y for y in a if y not in b]
``````

Only for demonstration purpose :
[y if y not in b else False for y in a ]

This is not a lambda function. It is a list comprehension.

Just change the order:

``````[ y for y in a if y not in b]
``````

If you use sufficiently big list `not in b` clause will do a linear search for each of the item in `a`. Why not use set? Set takes iterable as parameter to create a new set object.

``````>>> a = ["a", "b", "c", "d", "e"]
>>> b = ["c", "d", "f", "g"]
>>> set(a).intersection(set(b))
{'c', 'd'}
``````