Я изо всех сил пытаюсь найти более чистый способ возврата логического значения, если мой набор пуст в конце моей функции
Я беру пересечение двух наборов и хочу вернуться True
или в False
зависимости от того, пуст ли результирующий набор.
def myfunc(a,b):
c = a.intersection(b)
#...return boolean here
Моей первоначальной мыслью было сделать
return c is not None
Однако в моем интерпретаторе я легко вижу, что оператор вернет истину, если 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, потому что мне не нужны значения, я просто хочу знать, пересекаются ли они.
bool(set([]))
isdisjoint
. Я в полном шоке.Ответы:
def myfunc(a,b): c = a.intersection(b) return bool(c)
bool()
сделаю что-то подобноеnot not
, но более идеальное и понятное.источник
bool(...)
когда вы спрашиваетеis_empty
, непонятно. Я не выражаю намерения.not not
;). (FTR: я уже проголосовал за ответ @gefeis, но я не имею влияния на то, что OP принял…)не такой питонический, как другие ответы, а математика:
return len(c) == 0
Как некоторые комментарии задавались вопросом о влиянии, которое
len(set)
может иметь на сложность. Это O (1), как показано в исходном коде, поскольку он зависит от переменной, которая отслеживает использование набора.static Py_ssize_t set_len(PyObject *so) { return ((PySetObject *)so)->used; }
источник
len(c)
даже еслиc
он очень большой, что не нужно для проверки на пустоту.set()
(python 3.5.2 в Windows)Если вы хотите
return True
пустой набор, то, думаю, было бы проще сделать:return c == set()
т.е. "
c
равно пустомуset
".(Или, наоборот,
return c != set()
).На мой взгляд, это более явно (хотя и менее идиоматично), чем полагаться на интерпретацию Python пустого набора как
False
в логическом контексте.источник
Если
c
это множество , то вы можете проверить , является ли это пустым, выполнив:return not c
.Если
c
пусто, тоnot c
будетTrue
.В противном случае, если
c
содержит какие-либо элементы,not c
будетFalse
.источник
Когда ты говоришь:
c is not None
Фактически вы проверяете, ссылаются ли c и None на один и тот же объект. Это то, что делает оператор "is". В python None - это специальное нулевое значение, которое обычно означает, что у вас нет доступного значения. Сортировка как null в c или java. Поскольку python внутренне присваивает только одно значение None, используя оператор «is», чтобы проверить, работает ли что-то None (думаю, null), это стало популярным стилем. Однако это не связано со значением истинности набора c, это проверка того, что c действительно является набором, а не нулевым значением.
Если вы хотите проверить, является ли набор пустым в условном операторе, он приводится как логическое значение в контексте, поэтому вы можете просто сказать:
c = set() if c: print "it has stuff in it" else: print "it is empty"
Но если вы хотите, чтобы он был преобразован в логическое значение, чтобы сохранить его, вы можете просто сказать:
источник
""" 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()
источник
Не так чисто, как 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
источник