[Python] 목록이 비어 있는지 어떻게 확인합니까?


Answers

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

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

Yes: if not seq:
     if seq:

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

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

a = []

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




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

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



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

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






나는 다음을 선호한다 :

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

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




다음은 목록이 비어 있는지 확인할 수있는 몇 가지 방법입니다.

a = [] #the list

1) 꽤 간단한 pythonic 방법 :

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

파이썬에서는 목록, 튜플, 집합, 딕셔너리, 변수 등의 빈 컨테이너False 로 표시됩니다. 리스트를 단순히 부울 값으로 반환하는 술어로 처리 할 수 ​​있습니다. 그리고 True 값은 비어 있지 않음을 나타냅니다.

2) 훨씬 명확한 방법 : 길이를 찾고 len() 을 사용하여 길이가 0 인지 확인하십시오.

if len(a) == 0:
    print("a is empty")

3) 또는 익명의 빈 목록과 비교 :

if a == []:
    print("a is empty")

4) 또 다른 어리석은 방법은 exceptioniter() 사용하는 것입니다.

try:
    next(iter(a))
    # list has elements
except StopIteration:
    print("Error: a is empty")



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

a = []

.
.
.

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

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




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

>>> 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
>>> 



다른 사람들은 목록을 넘어 질문을 일반화하는 것처럼 보입니다. 그래서 나는 많은 사람들이 사용할 수있는 다른 유형의 시퀀스에주의해야한다고 생각했습니다. 특히 이것은 "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 밖으로 되돌아 가지는 않을 것이므로 일반적으로 같은 이름을 사용하기 scope .

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

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




패트릭 (받아 들인) 대답 은 맞다 : if not a: 그것을하는 적당한 방법이다. Harley Holcombe의 대답 은 이것이 PEP 8 스타일 가이드에 있다는 것입니다. Ruby 사용자 나 그 밖의 다른 사람들에게 명확하지 않거나 혼란 스럽다는 것을 개인적으로 알았더라도 그 답을 설명하는 것이 어째서 이디엄을 따르는 것이 좋은지에 관한 것입니다.

파이썬 코드와 파이썬 커뮤니티는 매우 강력한 숙어를 가지고 있습니다. 이러한 관용구를 따라하면 파이썬에 익숙한 사람이라면 코드를 더 쉽게 읽을 수 있습니다. 그리고 그 관용구를 위반할 때 그것은 강한 신호입니다.

if not a: 가 아닌 if not a: 빈 목록을 None 또는 숫자 0 또는 빈 튜플 또는 빈 사용자 작성 유형 또는 비어있는 사용자 생성 비 수집 모음 유형 또는 단일 요소 NumPy 배열과 구별하지 않는 if not a: 사실입니다 잘못된 값을 가진 스칼라로 행동하는 등의 일이 있습니다. 때때로 그것에 대해 명시하는 것이 중요합니다. 이 경우 명시 적으로 무엇 을 원하는지 알기 때문에 정확히 테스트 할 수 있습니다. 예를 들어 if not a and a is not None: 제외하고는 아무 것도 거짓 if not a and a is not None: if len(a) != 0: "빈 시퀀스 만 - 시퀀스 외의 모든 것은 여기 오류입니다"등의 의미입니다. . 테스트하려는 항목을 정확하게 테스트하는 것 외에도, 이는이 테스트가 중요하다는 것을 독자에게 알리는 것입니다.

그러나 당신이 명시해야 할 것이 없을 때, if not a: 독자를 오도하는 것입니다. 그렇지 않을 때 중요한 것으로 신호하고 있습니다. (코드의 유연성이 떨어지거나 느려지거나 뭐든간에 중요성은 낮아질 수 있습니다.) 그리고 습관적으로 이런 식의 독자를 오도하는 경우 구별을해야 할 때주의를 끌지 않을 것입니다. 당신은 코드 전체에 "울프 울고"있었어.




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

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.



단순히 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) 사용하여 여러 번 호출 할 수 있습니다.