Returning boolean if set is empty
I am struggling to find a more clean way of returning a boolean value if my set is empty at the end of my function
I take the intersection of two sets, and want to return True
or False
based on if the resulting set is empty.
def myfunc(a,b):
c = a.intersection(b)
#...return boolean here
My initial thought was to do
return c is not None
However, in my interpreter I can easily see that statement will return true if c = set([])
>>> c = set([])
>>> c is not None
True
I've also tried all of the following:
>>> c == None
False
>>> c == False
False
>>> c is None
False
Now I've read from the documentation that I can only use and
, or
, and not
with empty sets to deduce a boolean value. So far, the only thing I can come up with is returning not not c
>>> not not c
False
>>> not c
True
I have a feeling there is a much more pythonic way to do this, by I am struggling to find it. I don't want to return the actual set to an if statement because I don't need the values, I just want to know if they intersect.
Solution 1:
not as pythonic as the other answers, but mathematics:
return len(c) == 0
As some comments wondered about the impact len(set)
could have on complexity. It is O(1) as shown in the source code given it relies on a variable that tracks the usage of the set.
static Py_ssize_t
set_len(PyObject *so)
{
return ((PySetObject *)so)->used;
}
Solution 2:
def myfunc(a,b):
c = a.intersection(b)
return bool(c)
bool()
will do something similar to not not
, but more ideomatic and clear.
Solution 3:
If you want to return True
for an empty set, then I think it would be clearer to do:
return c == set()
i.e. "c
is equal to an empty set
".
(Or, for the other way around, return c != set()
).
In my opinion, this is more explicit (though less idiomatic) than relying on Python's interpretation of an empty set as False
in a boolean context.
Solution 4:
If c
is a set then you can check whether it's empty by doing: return not c
.
If c
is empty then not c
will be True
.
Otherwise, if c
contains any elements not c
will be False
.