세트가 비어있는 경우 부울 반환


97

내 함수가 끝날 때 내 세트가 비어 있으면 부울 값을 반환하는 더 깨끗한 방법을 찾기 위해 고군분투하고 있습니다.

두 세트의 교차점을 가져 와서 반환 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 문으로 반환하고 싶지 않고 교차하는지 알고 싶습니다.


4
그렇게 캐스팅하는 경우 빈 세트는 부울 거짓 해당하는 것으로 간주됩니다 :bool(set([]))
woozyking

3
그건 그렇고, 심각하게 잘 해결 된 질문은 놀랍습니다.
Jonas Schäfer 2014 년

@JonasWielicki 감사합니다! 대답을 감사하십시오-그 선을 따라 무언가라는 것을 알았습니다.
CB

이 질문은 5 년이 될 것이며 아무도 isdisjoint. 나는 완전히 충격을 받았다.
Adirio

답변:


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

bool()와 비슷 not not하지만 더 이데 오적이고 명확합니다.


7
나는 bool(...)당신이 요청할 때 쓰는 is_empty것은 모호합니다. 나는 의도를 표현하지 않습니다.
tamas.kenez 2010 년

2
@ tamas.kenez 그래도 not not;) 보다 더 명확하다는 것을 인정해야합니다 . (FTR은 : 이미 @gefeis 대답을 upvoted했지만, 일이 OP 허용에 나는 ... 영향을 미치지 않음)
조나스 Schafer 씨에게

108

다른 답변만큼 비단뱀 적이지는 않지만 수학 :

return len(c) == 0

일부 의견 len(set)은 복잡성에 미치는 영향에 대해 궁금해했습니다 . 세트의 사용을 추적하는 변수에 의존한다는 점에서 소스 코드 에서 볼 수 있듯이 O (1) 입니다.

static Py_ssize_t
set_len(PyObject *so)
{
    return ((PySetObject *)so)->used;
}

9
나는 이것이 실제로 더 낫다고 생각합니다. 그것은 당신의 의도가 무엇인지 명확하게 만듭니다.
arshajii

4
나는 이것이 매우 큰 len(c)경우에도 계산해야 할 것이 두렵다. 이것은 c비어 있는지 확인하기 위해 불필요하다.
Michele De Pascalis

1
@Glaedr 저는 일반적으로 사용되는 데이터 구조 (즉, 목록, 집합)에 대한 cpython len이 O (1)라고 믿습니다 (즉, 길이를 나타내는 데이터 구조에 변수를 저장합니다)
CB

2
^ +1 @CB 나는 len (c)에 대한 몇 가지 테스트를 수행했으며, 설정된 크기가 극적으로 큰 순서로 변경 될 때 무시할 수있는 런타임 차이가 있었기 때문에 len (c)을 나타내는 변수가 분명합니다.
dster77

1
@ dster77 나는 두 버전으로 내 코드를 프로파일과와 비교했을 때 그것은 매우 빠르고이었다 set()(창에서 파이썬 3.5.2)
mathiasfk

23

return True빈 세트 를 원한다면 다음을 수행하는 것이 더 명확 할 것이라고 생각합니다.

return c == set()

즉 " c는 빈 set" 과 같습니다 .

(또는 반대로, return c != set()).

제 생각에는 이것은 False부울 컨텍스트에서 와 같이 빈 집합에 대한 Python의 해석에 의존하는 것보다 더 명시 적입니다 (관용적이지는 않지만) .


2
사실, 파이썬의 해석에 의존하는 것은 매우 수용 가능한 관행입니다. 그 한계를 염두에 두는 한.
화산

17

경우 c집합입니다 당신은 그것을 수행하여 비어 있는지 여부를 확인할 수 있습니다 return not c.

경우 c비어있는 다음 not c될 것입니다 True.

그렇지 않으면 c요소 not c가 있으면 False.


6

네가 얘기 할 때:

c is not None

실제로 c와 None이 동일한 객체를 참조하는지 확인하고 있습니다. 이것이 "is"연산자가하는 일입니다. 파이썬에서 None은 일반적으로 사용 가능한 값이 없음을 의미하는 특별한 null 값입니다. c 또는 java에서 null과 비슷합니다. 파이썬은 내부적으로 "is"연산자를 사용하여 하나의 None 값만 할당하여 어떤 것이 None (null 생각)이 작동하는지 확인하기 때문에 인기있는 스타일이되었습니다. 그러나 이것은 집합 c의 진리 값과 관련이있을 필요가 없으며, c가 실제로 null 값이 아닌 집합인지 확인합니다.

조건문에서 집합이 비어 있는지 확인하려면 컨텍스트에서 부울로 캐스팅되므로 다음과 같이 말할 수 있습니다.

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

그러나 부울로 변환하여 저장하려면 간단히 다음과 같이 말할 수 있습니다.

c = set()
c_has_stuff_in_it = bool(c)

1
"""
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()

0

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.