Subtracting two lists in Python
Python 2.7 and 3.2 added the collections.Counter
class, which is a dictionary subclass that maps elements to the number of occurrences of the element. This can be used as a multiset. You can do something like this:
from collections import Counter
a = Counter([0, 1, 2, 1, 0])
b = Counter([0, 1, 1])
c = a - b # ignores items in b missing in a
print(list(c.elements())) # -> [0, 2]
As well, if you want to check that every element in b
is in a
:
# a[key] returns 0 if key not in a, instead of raising an exception
assert all(a[key] >= b[key] for key in b)
But since you are stuck with 2.5, you could try importing it and define your own version if that fails. That way you will be sure to get the latest version if it is available, and fall back to a working version if not. You will also benefit from speed improvements if if gets converted to a C implementation in the future.
try:
from collections import Counter
except ImportError:
class Counter(dict):
...
You can find the current Python source here.
I know "for" is not what you want, but it's simple and clear:
for x in b:
a.remove(x)
Or if members of b
might not be in a
then use:
for x in b:
if x in a:
a.remove(x)
I would do it in an easier way:
a_b = [e for e in a if not e in b ]
..as wich wrote, this is wrong - it works only if the items are unique in the lists. And if they are, it's better to use
a_b = list(set(a) - set(b))