python - 리스트 none - 목록이 비어 있는지 어떻게 확인합니까?


15 Answers

파이썬 방법은 PEP 8 스타일 가이드에서 제공됩니다 ( 는 "권장"을, 아니오 는 "권장하지 않음 "을 의미합니다).

시퀀스 (문자열,리스트, 튜플)의 경우 빈 시퀀스가 ​​거짓이라는 사실을 사용하십시오.

Yes: if not seq:
     if seq:

No:  if len(seq):
     if not len(seq):
Question

python null 체크

예를 들어 다음과 같이 전달 된 경우 :

a = []

빈칸인지 확인하려면 어떻게합니까?




다른 사람들은 목록을 넘어 질문을 일반화하는 것처럼 보입니다. 그래서 나는 많은 사람들이 사용할 수있는 다른 유형의 시퀀스에주의해야한다고 생각했습니다. 특히 이것은 "python test empty array"에 대한 첫 번째 Google 공격이기 때문에주의해야합니다. .

numpy 배열에 다른 메소드가 작동하지 않습니다.

list 이 좋거나 다른 표준 컨테이너에서 제대로 작동하는 다른 메서드는 수가 많지 않은 배열에 대해서는 실패하므로 numpy 배열에주의해야합니다. 왜 아래에, 그러나 짧게, 선호하는 방법을 설명하는 이유는 size 를 사용하는 것 size .

"pythonic"방식으로 작동하지 않습니다 : 1 부

numpy는 배열을 bool 의 배열로 캐스트하려고 시도하고 if x 가 일종의 집계 된 진리 값을 위해 모든 bool 을 동시에 평가하려고 시도 할 때 "파이썬"방식은 numpy 배열에서 실패합니다. 하지만 이것은 의미가 없으므로 ValueError 를 얻습니다.

>>> x = numpy.array([0,1])
>>> if x: print("x")
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

"파이썬"방식으로 작동하지 않습니다 : 2 부

그러나 적어도 위의 경우는 실패했다고합니다. 정확히 하나의 요소를 가진 열세 번째 배열이 if 문은 오류가 발생하지 않는다는 의미에서 "작동"합니다. 그러나 한 요소가 0 (또는 0.0 또는 false , ...) 인 경우 if 문은 틀린 결과로 false .

>>> x = numpy.array([0,])
>>> if x: print("x")
... else: print("No x")
No x

그러나 분명히 x 가 존재하고 비어 있지 않습니다! 이 결과는 당신이 원하는 것이 아닙니다.

len 을 사용하면 예기치 않은 결과가 발생할 수 있습니다.

예를 들어,

len( numpy.zeros((1,0)) )

배열에 요소가 없더라도 1을 반환합니다.

천진난만한 방법

scipy FAQ 에서 설명한 것처럼 numpy 배열을 알고있는 모든 경우에 올바른 방법은 if x.size 에 사용 if x.size .

>>> x = numpy.array([0,1])
>>> if x.size: print("x")
x

>>> x = numpy.array([0,])
>>> if x.size: print("x")
... else: print("No x")
x

>>> x = numpy.zeros((1,0))
>>> if x.size: print("x")
... else: print("No x")
No x

list , 수위 배열 또는 다른 것이 있는지 확실하지 않은 경우이 방법을 @dubiousjim이 제공하는 답변 과 결합하여 각 유형에 적합한 테스트가 사용되는지 확인할 수 있습니다. 그다지 "파이썬 성"이 아니지만, 적어도이 의미에서 열등감은 의도적으로 파이썬 성을 깨뜨 렸습니다.

입력이 비어 있는지 확인하는 것 외에도 인덱싱 또는 수학 연산과 같은 다른 numpy 기능을 사용하는 경우에는 입력 수십 개의 배열로 강제하는 것이 더 효율적입니다. 이 작업을 빠르게 수행 할 수있는 몇 가지 좋은 기능이 있습니다. 가장 중요한 것은 numpy.asarray 입니다. 이것은 입력을 받거나, 이미 배열 인 경우에는 아무 일도하지 않으며, 목록, 튜플 등의 배열에 입력을 래핑하며 선택적으로 선택한 dtype 으로 변환합니다. 따라서 수시로 빠를 수 있으며, 입력이 수적으로 배열 된 것으로 가정 할 수 있습니다. 배열에 대한 변환으로 인해 현재 scope 밖으로 되돌아 가지는 않을 것이므로 일반적으로 같은 이름을 사용합니다.

x = numpy.asarray(x, dtype=numpy.double)

이렇게하면이 페이지에서 볼 수있는 모든 경우에 x.size 검사가 작동합니다.




목록이 비어 있는지 확인하는 가장 좋은 방법

예를 들어 다음과 같이 전달 된 경우 :

a = []

빈칸인지 확인하려면 어떻게합니까?

짧은 답변:

부울 컨텍스트에 목록을 배치합니다 (예 : if 또는 while 문 사용). 비어 있으면 False 를 테스트하고, 그렇지 않으면 True 를 테스트합니다. 예 :

if not a:                           # do this!
    print('a is an empty list')

권위에 호소

PEP 8 은 Python의 표준 라이브러리에서 파이썬 코드에 대한 공식 파이썬 스타일 가이드로서 다음과 같이 주장합니다.

시퀀스 (문자열,리스트, 튜플)의 경우 빈 시퀀스가 ​​거짓이라는 사실을 사용하십시오.

Yes: if not seq:
     if seq:

No: if len(seq):
    if not len(seq):

우리는 표준 라이브러리 코드가 가능한 한 정확하고 정확해야한다고 생각해야합니다. 그러나 왜 그러한 경우이며, 왜이 지침이 필요한가?

설명

필자는 파이썬을 처음 접하는 경험 많은 프로그래머들이 자주 이와 같은 코드를 보았습니다.

if len(a) == 0:                     # Don't do this!
    print('a is an empty list')

그리고 게으른 언어 사용자는 다음과 같은 유혹을받을 수 있습니다.

if a == []:                         # Don't do this!
    print('a is an empty list')

이들은 각각의 다른 언어로 정확합니다. 그리고 이것은 심지어 의미 상으로 파이썬에서 정확합니다.

Python은 불리언 강제 변환을 통해 목록 객체의 인터페이스에서 직접적으로 이러한 의미를 지원하기 때문에 파이썬 적이라고 생각합니다.

docs (특히 빈 목록 인 [] )

기본적으로 개체는 클래스가 False 를 반환하는 __len__() 메서드 또는 개체와 함께 호출 될 때 0을 반환하는 __len__() 메서드를 정의하지 않는 한 true로 간주됩니다. 다음은 거짓으로 간주되는 내장 객체의 대부분입니다.

  • 거짓으로 정의 된 상수 : NoneFalse .
  • 0 , 0.0 , 0j , Decimal(0) , Fraction(0, 1)
  • 빈 시퀀스 및 컬렉션 : '' , () , [] , {} , set() , range(0)

그리고 데이터 모델 문서 :

object.__bool__(self)

진리 값 테스트 및 기본 제공 작업 bool() 을 구현하기 위해 호출됩니다. False 또는 True 반환해야합니다. 이 메서드가 정의되어 있지 않으면 __len__() 이 정의되어 있으면 호출되고 결과는 0이 아닌 경우 true로 간주됩니다. 클래스가 __len__()__bool__() 도 정의하지 __len__() 모든 인스턴스가 참인 것으로 간주됩니다.

object.__len__(self)

내장 함수 len() 을 구현하기 위해 호출되었습니다. 객체의 길이, 정수> = 0을 반환해야합니다. 또한 __bool__() 메서드를 정의하지 않고 __len__() 메서드가 0을 반환하는 객체는 부울 상황에서 false로 간주됩니다.

그래서 이것 대신 :

if len(a) == 0:                     # Don't do this!
    print('a is an empty list')

아니면 이거:

if a == []:                     # Don't do this!
    print('a is an empty list')

이 작업을 수행:

if not a:
    print('a is an empty list')

Pythonic을하는 것은 보통 성능면에서 효과가 있습니다.

갚아야합니까? (동등한 작업을 수행하는 시간이 단축됩니다.)

>>> import timeit
>>> min(timeit.repeat(lambda: len([]) == 0, repeat=100))
0.13775854044661884
>>> min(timeit.repeat(lambda: [] == [], repeat=100))
0.0984637276455409
>>> min(timeit.repeat(lambda: not [], repeat=100))
0.07878462291455435

규모의 경우 여기에 함수를 호출하고 빈 목록을 생성하고 반환하는 비용이 있습니다.이 값은 위에 사용 된 빈 검사 수를 뺀 값입니다.

>>> min(timeit.repeat(lambda: [], repeat=100))
0.07074015751817342

우리는 builtin 함수 len 길이를 0 비교 하거나 빈리스트를 검사하는 것이 문서화 된대로 내장 된 언어 구문을 사용하는 것보다 훨씬 성능이 떨어진다는 것을 알 수 있습니다.

왜?

len(a) == 0 :

첫 번째 파이썬은 len 이 숨겨진 지 확인하기 위해 전역을 검사해야합니다.

그런 다음 함수를 호출하고 0 로드하고 Python에서 동등 비교를 수행해야합니다 (C 대신).

>>> import dis
>>> dis.dis(lambda: len([]) == 0)
  1           0 LOAD_GLOBAL              0 (len)
              2 BUILD_LIST               0
              4 CALL_FUNCTION            1
              6 LOAD_CONST               1 (0)
              8 COMPARE_OP               2 (==)
             10 RETURN_VALUE

그리고 [] == [] 경우 불필요한 목록을 작성한 다음 파이썬의 가상 머신 (C와 반대)에서 비교 작업을 수행해야합니다.

>>> dis.dis(lambda: [] == [])
  1           0 BUILD_LIST               0
              2 BUILD_LIST               0
              4 COMPARE_OP               2 (==)
              6 RETURN_VALUE

"Pythonic"방법은 목록의 길이가 객체 인스턴스 헤더에 캐시되므로 훨씬 간단하고 빠른 검사입니다.

>>> dis.dis(lambda: not [])
  1           0 BUILD_LIST               0
              2 UNARY_NOT
              4 RETURN_VALUE

C 소스 및 문서의 증거

PyVarObject

이것은 ob_size 필드를 추가하는 PyObject 의 확장입니다. 이것은 길이의 개념이있는 오브젝트에만 사용됩니다. 이 유형은 Python / C API에 자주 표시되지 않습니다. 이것은 PyObject_VAR_HEAD 매크로의 확장으로 정의 된 필드에 해당합니다.

Include/listobject.h 의 c 소스에서 :

typedef struct {
    PyObject_VAR_HEAD
    /* Vector of pointers to list elements.  list[0] is ob_item[0], etc. */
    PyObject **ob_item;

    /* ob_item contains space for 'allocated' elements.  The number
     * currently in use is ob_size.
     * Invariants:
     *     0 <= ob_size <= allocated
     *     len(list) == ob_size

나는 이것에 대한 연구를 즐겼고, 나는 많은 시간을 내 대답에 사용했다. 내가 뭔가를 남기고 있다고 생각하면 코멘트에 나에게 알려주세요.




나는 아래를 선호하는 것으로 보았다.

if not a:
    print("The list is empty or null")






파이썬은 공허의 처리에 대해 매우 균일합니다. 다음을 감안할 때 :

a = []

.
.
.

if a:
   print("List is not empty.")
else:
   print("List is empty.")

"if"문으로 목록 a를 체크하면 비어 있는지 확인할 수 있습니다. 내가 읽었으며 배웠던 것에서 이것은 목록이나 튜플이 비어 있는지보기위한 "파이썬적인"방법입니다.




진리 가치 테스트에 관한 documentation 에서 :

여기에 나열된 것 이외의 모든 값은 True 로 간주됩니다.

  • None
  • False
  • 0 , 0.0 , 0j 와 같이 숫자 형식의 0 입니다.
  • 모든 빈 시퀀스 (예 : '' , () , [] .
  • 모든 빈 맵핑 (예 : {} .
  • 클래스가 __bool__() 또는 __len__() 메서드를 정의하고 해당 메서드가 정수 0 또는 bool 값 False 반환하면 사용자 정의 클래스의 인스턴스입니다.

보시다시피, 빈리스트 []거짓이어서 , 불리언 값으로 행해지는 것을하는 것이 가장 효율적으로 들린다 :

if not a:
    print('"a" is empty!')



나는 다음을 선호한다 :

if a == []:
   print "The list is empty."

읽을 수 있고 변수를 반복 할 len() 과 같은 함수를 호출하는 것에 대해 걱정할 필요가 없습니다. 비록 내가 이런 식의 BigO 표기법이 무엇인지는 잘 모르겠지만 ... 파이썬은 그렇게 우스꽝스럽게 빠르다. 거대한 것이 아니라면 그것이 중요 할 것 같지 않다.




또 다른 간단한 방법이 될 수 있습니다.

a = []
if len(a) == 0:
  print("Empty")
else:
  print(" Not empty")



이처럼 bool ()을 사용해 볼 수도 있습니다.

    a = [1,2,3];
    print bool(a); # it will return True
    a = [];
    print bool(a); # it will return False

나는 목록이 비어 있는지 확인하기 위해이 방법을 좋아합니다.

매우 편리하고 유용합니다.




많은 답변이 주어졌으며 많은 답변이 제공됩니다. 나는 단지 그 수표를 덧붙이고 싶었다.

not a

None 및 기타 유형의 빈 구조도 전달합니다. 정말로 빈 목록을 확인하려면 다음을 수행 할 수 있습니다.

if isinstance(a, list) and len(a)==0:
    print("Received an empty list")



단순히 is_empty ()를 사용하거나 다음과 같은 함수를 작성하십시오 : -

def is_empty(any_structure):
    if any_structure:
        print('Structure is not empty.')
        return True
    else:
        print('Structure is empty.')
        return False  

목록, 튜플, 사전 등의 모든 data_structure에 사용할 수 있습니다. 이것에 의해, 당신은 단지 is_empty(any_structure) 사용하여 여러 번 호출 할 수 있습니다.




목록이 비어 있는지 확인하려는 경우;

l = []
if l:
    # do your stuff.

날씨를 확인하려면 목록의 모든 값이 비어 있습니다.

l = ["", False, 0, '', [], {}, ()]
if all(bool(x) for x in l):
    # do your stuff.

그러나 빈 목록에 대해서는 True입니다.

def empty_list(lst):
    if len(lst) ==0:
        return false
    else:
        return all(bool(x) for x in l)

이제 다음을 사용할 수 있습니다.

if empty_list(lst):
    # do your stuff.



Collection.Any ()는 list가 비어있는 경우 항상 false를 반환합니다.




파이썬 대화 형 터미널에서 실행되는 다음 코드를 살펴보십시오.

>>> a = []
>>> if a:
...     print "List is not empty";
... else:
...     print "List is empty"
... 
List is empty
>>> 
>>> a = [1, 4, 9]
>>> if a:
...     print "List is not empty";
... else:
...     print "List is empty"
... 
List is not empty
>>> 


Related