Python operator, no operator for "not in"
indexing, performance, python
Solution
Another function is not necessary here. `not in` is the inverse of `in`, so you have the following mappings:
obj in seq => contains(seq, obj)
obj not in seq => not contains(seq, obj)
You are right this is not consistent with `is`/`is not`, since identity tests should be symmetrical. This might be a design artifact.
Problem
Looking at the mapping of operators to functions, I noticed that there is no function to express the `not in` operator. At first I thought this was probably because the interpreter just reorders this to be `not x in y`, but there is a function for `is not` which seems like it should behave exactly the same as `not in`. Am I missing something, or does that operator really not exist? Here's a really stupid example where you might want this: ``` def compare_iter(a, b, func): return [func(aa, bb) for aa, bb in zip(a, b)] my_compare = compare_iter(xx, yy, lambda x, y:x not in y) # lambda -- yuck my_compare = map(operator.not_, compare_iter(xx, yy, operator.contains) # Extra map? grr... # It would be nice to do: my_compare = compare_iter(xx, yy, operator.not_contains) ``` Of course I could write my own function for this, but then you pay a price in efficiency whereas the operator module could push this code out of Python and therefore execute faster.