Python's "In" Set Operator

Python's "In" Set Operator

I'm a little confused about the python in operator for sets.

If I have a set s and some instance b, is it true that b in s means "is there some element x in s such that b == x is true"?

2

6 Answers

Yes, but it also means hash(b) == hash(x), so equality of the items isn't enough to make them the same.

3

That's right. You could try it in the interpreter like this:

>>> a_set = set(['a', 'b', 'c'])

>>> 'a' in a_set
True

>>>'d' in a_set
False
1

Yes it can mean so, or it can be a simple iterator. For example: Example as iterator:

a=set(['1','2','3'])
for x in a:
 print ('This set contains the value ' + x)

Similarly as a check:

a=set('ILovePython')
if 'I' in a:
 print ('There is an "I" in here')

edited: edited to include sets rather than lists and strings

3

Sets behave different than dicts, you need to use set operations like issubset():

>>> k
{'ip': '123.123.123.123', 'pw': 'test1234', 'port': 1234, 'debug': True}
>>> set('ip,port,pw'.split(',')).issubset(set(k.keys()))
True
>>> set('ip,port,pw'.split(',')) in set(k.keys())
False
3

Strings, though they are not set types, have a valuable in property during validation in scripts:

yn = input("Are you sure you want to do this? ")
if yn in "yes":
    #accepts 'y' OR 'e' OR 's' OR 'ye' OR 'es' OR 'yes'
    return True
return False

I hope this helps you better understand the use of in with this example.

2

List's __contains__ method uses the __eq__ method of its elements. Whereas set's __contains__ uses __hash__. Have a look to the following example that I wish will be explicit:

class Salary:
    """An employee receives one salary for each job he has."""

    def __init__(self, value, job, employee):
        self.value = value
        self.job = job
        self.employee = employee

    def __repr__(self):
        return f"{self.employee} works as {self.job} and earns {self.value}"

    def __eq__(self, other):
        """A salary is equal to another if value is equal."""
        return self.value == other.value

    def __hash__(self):
        """A salary can be identified with the couple employee-job."""
        return hash(self.employee) + hash(self.job)

alice = 'Alice'
bob = 'Bob'
engineer = 'engineer'
teacher = 'teacher'

alice_engineer = Salary(10, engineer, alice)
alice_teacher = Salary(8, teacher, alice)
bob_engineer = Salary(10, engineer, bob)

print(alice_engineer == alice_teacher)
print(alice_engineer == bob_engineer, '\n')

print(alice_engineer is alice_engineer)
print(alice_engineer is alice_teacher)
print(alice_engineer is bob_engineer, '\n')

alice_jobs = set([alice_engineer, alice_teacher])
print(alice_jobs)
print(bob_engineer in alice_jobs)  # IMPORTANT
print(bob_engineer in list(alice_jobs))  # IMPORTANT

Console prints:

False
True 

True
False
False 

{Alice works as teacher and earns 8, Alice works as engineer and earns 10}
False
True

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

James H. Sterling
Author

James H. Sterling

James Sterling reports on renewable energy developments, climate policy, ecological conservation, and green tech innovations around the globe.