Python *in* operator is membership test operator.*Examples:*List—-

In [1]: python_webframeworks = ['flask', 'django', 'pylons', 'pyramid', 'brubeck'] In [2]: 'flask' in python_webframeworks Out[2]: True In [3]: 'web.py' in python_webframeworks Out[3]: False

in operator iterates over the list of elements and returns True or False.

What about nested list?

In [4]: webframeworks = [['flask', 'django', 'pyramid'],['rails', 'sintara'],['zend', 'symfony']] In [5]: 'flask' in webframeworks Out[5]: False

in isnt handy for nested list, unless it is overriden.

Dict

in operator against dictionary checks for the presence of key.

In [7]: person = {'name': 'kracekumar', 'country': 'India', 'os': 'Linux', 'programming_languages': {'web': 'php', 'multi_paradigm': ['python', 'ruby', 'java', 'c#']}} In [8]: 'name' in person Out[8]: True

in doesnt check inside key if value is dict

In [9]: 'web' in person Out[9]: False

In case if dict needs to look into keys whose value is dict, you need to override __contains__ . At the end of the blog post I will explain, now lets create a class which is inherited from dict and try the same experiment.

In [10]: class Person(dict): ....: pass ....: In [11]: p = Person() In [12]: p Out[12]: {} In [13]: p['name'] = 'krace' In [14]: p Out[14]: {'name': 'krace'}

To make things simple __init__ and other magic methods are omitted.

In [15]: 'name' in p Out[15]: True

Set

In [16]: conferences_attended = set(['Pycon - India', 'code retreat', 'JSFOO', 'Meta Refresh']) In [17]: 'Pycon - India' in conferences_attended Out[17]: True

Generators

In [18]: 2 in xrange(3) Out[18]: True

Nested list

In [19]: nested_list = [[1, 3, 5, 7], [2, 4, 6, 8], []] In [20]: [] in nested_list Out[20]: True In [21]: [2, 4, 6, 8] in nested_list Out[21]: True

In case of nested list checking whether inner list is empty is pretty handy.

Strings

In [23]: message = " Python is simple and powerful programming language " In [24]: "Python" in message Out[24]: True In [25]: message.find("Python") Out[25]: 1 In [26]: message = "Python is simple and powerful programming language " In [27]: message.find("Python") Out[27]: 0

in can be used to check the presence of a sequence or substring against string. In other languages there will be function to check for substring, but in python its very straightforward. This is one of the reason why I love Python.

NOTE:

Dont use find method in string to find the existence of a substring because it will return the position.

if message.find(text): #lets do what we need do else: #fall back

Above snippet is wrong since text might be present in the beginning which will result 0 and if condition will fail.

Files

In [29]: with open('test.txt', 'w') as f: f.write(" some text for checking") ....: In [32]: with open('test.txt', 'r') as f: for text in f: print 'some' in text ....: True

overriding __contains__

Consider a class Person which is inherited from dict and override __contains__

In [153]: class Person(dict): .....: def __contains__(self, item): .....: for key in self: .....: if key is item: .....: return True .....: else: .....: if isinstance(self[key], dict): .....: for k in self[key]: .....: if k is item: .....: return True .....: else: .....: return False .....: In [154]: p = Person() In [155]: p['skills'] = {'programming_languages': {'web': ['php'], 'multi_paradigm': ['python', 'ruby', 'c#']} } In [156]: 'skills' in p Out[156]: True In [157]: 'programming_languages' in p Out[157]: True In [158]: 'web' in p Out[158]: False

In the above example key will be looked for two level dict only.

See also