파이썬 : '사전'이 비어 있는지 확인하면 작동하지 않는 것 같습니다.


396

사전이 비어 있는지 확인하려고하지만 제대로 작동하지 않습니다. 그냥 건너 뛰고 메시지를 표시하는 것을 제외 하고는 온라인 으로 표시합니다. 왜 어떤 아이디어?

 def isEmpty(self, dictionary):
   for element in dictionary:
     if element:
       return True
     return False

 def onMessage(self, socket, message):
  if self.isEmpty(self.users) == False:
     socket.send("Nobody is online, please use REGISTER command" \
                 " in order to register into the server")
  else:
     socket.send("ONLINE " + ' ' .join(self.users.keys())) 

6
self.users비어 있지 않은지 확인하려면 다음을 수행하십시오 if self.users.
— BrenBarn

4
당신은 isEmpty실제로 반환 True사전에서 얻은 첫 번째 키가 truey 및 반환의 경우 False그렇지. 사전이 비어있는 경우에는 반환 None하지 않은 == False.
— Hyperboreus

if 문이 거꾸로 있습니다.
— Mad Physicist

잘못된 키를 조심하십시오 stackoverflow.com/a/17347421/1379762
— Wajih

답변:


737

빈 사전 은 파이썬에서 평가됩니다False .

>>> dct = {}
>>> bool(dct)
False
>>> not dct
True
>>>

따라서 isEmpty기능이 필요하지 않습니다. 당신이해야 할 일은 :

def onMessage(self, socket, message):
    if not self.users:
        socket.send("Nobody is online, please use REGISTER command" \
                    " in order to register into the server")
    else:
        socket.send("ONLINE " + ' ' .join(self.users.keys()))

7
@Wajih 링크는 관련이 없습니다 : bool({False: False})여전히으로 평가됩니다 True. 당신이 준 링크는 any키에 의존 하는 방법에 해당 합니다.
— Ulysse BN

@Wajih 무슨 뜻인가요?
— Charlie Parker

2
나는 'dict dict'이 명시 적이 지 않다고 느낀다
— imbatman

동의, 부울을 사용하는 느낌이 not <dict>너무 명확하지 않습니다
— cryanbhu

130

dict이 비어 있는지 확인할 수있는 세 가지 방법이 있습니다. 그래도 첫 번째 방법을 선호합니다. 다른 두 가지 방법은 너무 장황합니다.

test_dict = {}

if not test_dict:
    print "Dict is Empty"


if not bool(test_dict):
    print "Dict is Empty"


if len(test_dict) == 0:
    print "Dict is Empty"

44
한숨 ... 모두가 "pythonic"을 좋아하고 가장 적은 문자를 입력합니다. 첫째, 또 다른 기준은 가독성입니다. 둘째, 위의 답변에서 첫 번째 테스트는 dict가 존재하고 비어있는 경우뿐만 아니라 test_dict가 None 인 경우에도 적용됩니다. 따라서이 테스트는 dict 객체가 존재하거나 차이가 중요하지 않은 경우에만 사용하십시오. 두 번째 방법은 그 행동도 있습니다. test_dict가 None 인 경우 세 번째 방법 만 짖습니다.
— Andreas Maier

1
@AndreasMaier 정확히 내 기분도. 또한 파이썬은 동적으로 입력됩니다. 함수 내에서 "x가 비어 있지 않은 사전 인 경우, 이렇게하십시오; x가 비어 있지 않은 numpy 배열 인 경우 수행하십시오"를 확인하는 것이 일반적입니다. 다음 첫 번째 코드에 실패 if xX는 NumPy와 배열 때
— jf328가

1
@Wajih 당신이 링크는 여전히 여기에 관련이 없습니다 ... 이유를
— Ulysse BN

1
내가 공유 한 우려로 인해 기술적으로는 정확하지만이를지지하지 않습니다. @AndreasMaier
— Stunner

16
dict = {}
print(len(dict.keys()))

길이가 0이면 dict가 비어 있음을 의미합니다.


3
이 코드 스 니펫은 문제를 해결할 수 있지만 설명을 포함하면 게시물의 품질을 향상시키는 데 실제로 도움이됩니다. 앞으로 독자에게 질문에 대한 답변을 제공하고 있으며 해당 사람들이 귀하의 코드 제안 이유를 모를 수도 있습니다.
— DimaSan

1
len(dict.keys())에 해당len(dict)
— pdpAxis

@pdpAxis 그것이 제공하는 값으로, 구현이 dict.__len__조금 더 빠를 것이라고 생각합니다. :)
— Mateen Ulhaq

6

빈 dict를 확인하는 간단한 방법은 다음과 같습니다.

        a= {}

    1. if a == {}:
           print ('empty dict')
    2. if not a:
           print ('empty dict')

방법 1st가 a = None 인 경우보다 더 엄격하지만 방법 1은 올바른 결과를 제공하지만 방법 2는 잘못된 결과를 제공합니다.


1

사전은 False빈 사전 및 비어 있지 않은 사전으로 평가되는 부울로 자동 캐스트 될 수 있습니다 True.

if myDictionary: non_empty_clause()
else: empty_clause()

이것이 너무 관용적으로 보이지 않으면 len(myDictionary)0 또는 set(myDictionary.keys())빈 세트를 테스트하거나과의 동등성을 테스트 할 수도 있습니다 {}.

isEmpty 함수는 불필요 할뿐만 아니라 구현에 prima-facie를 발견 할 수있는 여러 문제가 있습니다.

  1. 이 return False문장은 한 단계 너무 깊이 들여 쓰기되었습니다. for 루프 외부에 있어야하며 for명령문 과 같은 레벨에 있어야 합니다. 결과적으로, 키가 존재하는 경우 코드는 임의로 선택된 하나의 키만 처리합니다. 키가 존재하지 않으면이 함수는를 반환 None하고 부울 False로 캐스트됩니다. 아야! 빈 사전은 모두 거짓 음성으로 분류됩니다.
  2. 사전이 비어 있지 않으면 코드는 하나의 키만 처리하고 캐스트 된 값을 부울로 리턴합니다. 호출 할 때마다 동일한 키가 평가된다고 가정 할 수도 없습니다. 따라서 오 탐지가있을 것입니다.
  3. return False명령문 의 들여 쓰기를 정정 하고 for루프 외부로 가져 오십시오 . 그런 다음 모든 키 의 부울 OR 또는False 사전이 비어있는 경우입니다. 여전히 당신은 오탐과 오탐을 가질 것입니다. 증거를 찾기 위해 다음 사전에 대해 정정하고 테스트하십시오.

myDictionary={0:'zero', '':'Empty string', None:'None value', False:'Boolean False value', ():'Empty tuple'}


-1

get ()을 사용할 수도 있습니다. 처음에는 키가 있는지 확인하는 것만 믿었습니다.

>>> d = { 'a':1, 'b':2, 'c':{}}
>>> bool(d.get('c'))
False
>>> d['c']['e']=1
>>> bool(d.get('c'))
True

get과 함께 좋아하는 것은 예외가 발생하지 않으므로 큰 구조를 쉽게 통과 할 수 있다는 것입니다.


-4

평등 테스트를 사용하지 않는 이유는 무엇입니까?

def is_empty(my_dict):
    """
    Print true if given dictionary is empty
    """
    if my_dict == {}:
        print("Dict is empty !")

이는 구문 오류처럼 보이며 질문의 맥락에서 확인을 적용하는 방법을 보여주지 않습니다.
— Roland Weber

-7

'any'를 사용하십시오

dict = {}

if any(dict) :

     # true
     # dictionary is not empty 

else :

     # false 
     # dictionary is empty

4
anydict에 임의의 키가 포함되어 있는지 확인합니다. 예를 들어 dict가 비어 있지 않은 경우에도 any({0: 'something'})반환False
— Railslide

그렇습니다. 진실하고 공허한 두 경우 모두에서 구원을 얻으려면 다른 현명한 부울이 진실한 경우에 맞았을 것입니다. 일반적인 코딩 목적으로 생각한다면.
— chhotu sardar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.