Check if something is (not) in a list in Python
This video is brought to you by Memorabit, an app that sends technical terms, commands and definitions as reminders at unexpected moments, so they stay in memory. Built on cognitive science principles. Start free on web, iOS and Android:
iOS: https://apps.apple.com/app/id6782301691
Android: https://play.google.com/store/apps/detai...
--------------------------------------------------
Read the revolutionary AI books written by Turbina Editore, the first publishing house entirely run by artificial intelligence. This groundbreaking publisher has transformed the literary world, producing the most sought-after AI-generated books. Start reading today at:
https://turbinaeditore.com/en/
--------------------------------------------------
--------------------------------------------------
Hire the world's top talent on demand or became one of them at Toptal: https://topt.al/25cXVn
and get $2,000 discount on your first invoice
--------------------------------------------------
Take control of your privacy with Proton's trusted, Swiss-based, secure services.
Choose what you need and safeguard your digital life:
Mail: https://go.getproton.me/SH1CU
VPN: https://go.getproton.me/SH1DI
Password Manager: https://go.getproton.me/SH1DJ
Drive: https://go.getproton.me/SH1CT
Music by Eric Matyas
https://www.soundimage.org
Track title: Switch On Looping
--
Chapters
00:00 Check If Something Is (Not) In A List In Python
00:25 Accepted Answer Score 770
00:43 Answer 2 Score 62
03:50 Answer 3 Score 0
04:15 Answer 4 Score 1
05:01 Thank you
--
Full question
https://stackoverflow.com/questions/1040...
--
Content licensed under CC BY-SA
https://meta.stackexchange.com/help/lice...
--
Tags
#python #list #conditional #membership
#avk47
ACCEPTED ANSWER
Score 770
The bug is probably somewhere else in your code, because it should work fine:
>>> 3 not in [2, 3, 4]
False
>>> 3 not in [4, 5, 6]
True
Or with tuples:
>>> (2, 3) not in [(2, 3), (5, 6), (9, 1)]
False
>>> (2, 3) not in [(2, 7), (7, 3), "hi"]
True
ANSWER 2
Score 62
How do I check if something is (not) in a list in Python?
The cheapest and most readable solution is using the in operator (or in your specific case, not in). As mentioned in the documentation,
The operators
inandnot intest for membership.x in sevaluates toTrueifxis a member ofs, andFalseotherwise.x not in sreturns the negation ofx in s.
Additionally,
The operator
not inis defined to have the inverse true value ofin.
y not in x is logically the same as not y in x.
Here are a few examples:
'a' in [1, 2, 3]
# False
'c' in ['a', 'b', 'c']
# True
'a' not in [1, 2, 3]
# True
'c' not in ['a', 'b', 'c']
# False
This also works with tuples, since tuples are hashable (as a consequence of the fact that they are also immutable):
(1, 2) in [(3, 4), (1, 2)]
# True
If the object on the RHS defines a __contains__() method, in will internally call it, as noted in the last paragraph of the Comparisons section of the docs.
...
inandnot in, are supported by types that are iterable or implement the__contains__()method. For example, you could (but shouldn't) do this:
[3, 2, 1].__contains__(1)
# True
in short-circuits, so if your element is at the start of the list, in evaluates faster:
lst = list(range(10001))
%timeit 1 in lst
%timeit 10000 in lst # Expected to take longer time.
68.9 ns ± 0.613 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
178 µs ± 5.01 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
If you want to do more than just check whether an item is in a list, there are options:
list.indexcan be used to retrieve the index of an item. If that element does not exist, aValueErroris raised.list.countcan be used if you want to count the occurrences.
The XY Problem: Have you considered sets?
Ask yourself these questions:
- do you need to check whether an item is in a list more than once?
- Is this check done inside a loop, or a function called repeatedly?
- Are the items you're storing on your list hashable? IOW, can you call
hashon them?
If you answered "yes" to these questions, you should be using a set instead. An in membership test on lists is O(n) time complexity. This means that python has to do a linear scan of your list, visiting each element and comparing it against the search item. If you're doing this repeatedly, or if the lists are large, this operation will incur an overhead.
set objects, on the other hand, hash their values for constant time membership check. The check is also done using in:
1 in {1, 2, 3}
# True
'a' not in {'a', 'b', 'c'}
# False
(1, 2) in {('a', 'c'), (1, 2)}
# True
If you're unfortunate enough that the element you're searching/not searching for is at the end of your list, python will have scanned the list upto the end. This is evident from the timings below:
l = list(range(100001))
s = set(l)
%timeit 100000 in l
%timeit 100000 in s
2.58 ms ± 58.9 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
101 ns ± 9.53 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
As a reminder, this is a suitable option as long as the elements you're storing and looking up are hashable. IOW, they would either have to be immutable types, or objects that implement __hash__.
ANSWER 3
Score 1
I know this is a very old question but in the OP's actual question of "What have I done wrong?", the problem seems to be in how they coded the following:
take the branch ONLY if the tuple is not in the list
As OP observes, this is logically equivalent to:
IF tuple in list THEN don't take the branch
It's, however, entirely silent on what should happen IF tuple not in list. In particular, it doesn't follow that
IF tuple not in list THEN take the branch
So OP's rule never mentions what to do IF tuple not in list. Apart from that, as the other answers have noted, not in is the correct syntax to check if an object is in a list (or any container really). For example:
# check if `my_tuple` is not in `my_list`
my_tuple not in my_list
ANSWER 4
Score 0
One can also use the count method of list class: lets say we have a list:
x = [10,20,30,40,50]
To confirm if we have an element(i.e 10) in the list or Not and the frequency of its occurrence:
if x.count(10):
print(x.count(10))
else:
print(10," Not in the list")