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"?
6 Answers
Yes, but it also means hash(b) == hash(x), so equality of the items isn't enough to make them the same.
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 1Yes 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
3Sets 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 3Strings, 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.
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