Reputation: 3621
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
"?
Upvotes: 190
Views: 384222
Reputation: 706
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
Upvotes: 2
Reputation: 3529
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
Upvotes: 7
Reputation: 7109
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.
Upvotes: 3
Reputation: 521
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
Upvotes: 16
Reputation: 5901
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
Upvotes: 114
Reputation: 798526
Yes, but it also means hash(b) == hash(x)
, so equality of the items isn't enough to make them the same.
Upvotes: 129