You can do this with list comprehension:
a = [True, False, True]
b = [not bool for bool in a]
What this does is basically analogous to:
a = [True, False, True]
b = []
for bool in a:
b.append(not bool)
Or more generally:
new_list = [expression for item in a_list]
is essentially the same as:
new_list = []
for item in a_list:
new_list.append(expression)
where expression
can contain item
The reason your version doesn't work is that not can only operate on booleans and will implicitly convert anything passed to it to a boolean. A non-empty list results in True and applying not to that gives you False