Подтвердить что ты не робот

Возврат boolean, если set пуст

Я пытаюсь найти более чистый способ возврата логического значения, если мой набор пуст в конце моей функции

Я беру пересечение двух наборов и хочу вернуть True или False на основании того, что результирующий набор пуст.

def myfunc(a,b):
    c = a.intersection(b)
    #...return boolean here

Моя первоначальная мысль заключалась в том, чтобы сделать

return c is not None

Однако в моем интерпретаторе я легко вижу, что оператор вернет true, если c = set([])

>>> c = set([])
>>> c is not None
True

Я также пробовал все из следующих действий:

>>> c == None
False
>>> c == False
False
>>> c is None
False

Теперь я прочитал из документации, что я могу использовать только and, or и not с пустыми наборами, чтобы вывести логическое значение. Пока что единственное, что я могу придумать, это вернуть не c

>>> not not c
False
>>> not c
True

У меня есть чувство, что есть намного более питонический способ сделать это, я изо всех сил пытаюсь его найти. Я не хочу возвращать фактический набор в оператор if, потому что мне не нужны значения, я просто хочу знать, пересекаются ли они.

4b9b3361

Ответ 1

def myfunc(a,b):
    c = a.intersection(b)
    return bool(c)

bool() будет делать что-то похожее на not not, но более идеоматично и ясно.

Ответ 2

не как пифонические, как другие ответы, а математика:

return len(c) == 0

Ответ 3

Если вы хотите return True для пустого набора, то я думаю, что было бы более ясным:

return c == set()

то есть. "c равно пустой set".

(Или, наоборот, return c != set()).

По-моему, это более явный (хотя и менее идиоматический), чем полагающийся на интерпретацию Python пустого набора как False в булевом контексте.

Ответ 4

Если c - это набор, вы можете проверить, пуст ли он: return not c.

Если c пусто, то not c будет True.

В противном случае, если c содержит любые элементы not c будет False.

Ответ 5

Когда вы говорите:

c is not None

Фактически вы проверяете, ссылаются ли c и None на один и тот же объект. Это то, что делает оператор "есть". В python None - это специальное значение null, которое обычно означает, что у вас нет доступного значения. Сорта вроде null в c или java. Поскольку python внутренне присваивает только одно значение None, используя оператор "is", чтобы проверить, работает ли что-то None (think null), и стал популярным. Однако это не связано с истинным значением множества c, он проверяет, что c фактически является множеством, а не нулевым значением.

Если вы хотите проверить, является ли набор пустым в условном выражении, он отображается как булев в контексте, поэтому вы можете просто сказать:

c = set()
if c:
   print "it has stuff in it"
else:
   print "it is empty"

Но если вы хотите, чтобы он преобразовывался в булев, который нужно сохранить, вы можете просто сказать:

c = set()
c_has_stuff_in_it = bool(c)

Ответ 6

Не так чисто, как bool (c), но это было оправдание для использования тернарности.

def myfunc(a,b):
    return True if a.intersection(b) else False

Также, используя бит одной и той же логики, нет необходимости назначать c, если вы не используете его для чего-то еще.

def myfunc(a,b):
    return bool(a.intersection(b))

Наконец, я бы предположил, что вы хотите значение True/False, потому что вы собираетесь выполнять с ним некоторый булевский тест. Я бы рекомендовал пропустить накладные расходы на вызов функции и определение, просто проверив, где вам это нужно.

Вместо:

if (myfunc(a,b)):
    # Do something

Возможно, это:

if a.intersection(b):
    # Do something

Ответ 7

"""
This function check if set is empty or not.
>>> c = set([])
>>> set_is_empty(c)
True

:param some_set: set to check if he empty or not.
:return True if empty, False otherwise.
"""
def set_is_empty(some_set):
    return some_set == set()