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


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.