Python: Kiểm tra xem 'Từ điển' có trống không dường như không hoạt động


396

Tôi đang cố kiểm tra xem từ điển có trống không nhưng nó không hoạt động đúng. Nó chỉ bỏ qua nó và hiển thị TRỰC TUYẾN mà không cần bất cứ điều gì ngoại trừ hiển thị thông báo. Bất cứ ý tưởng tại sao?

 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
Để kiểm tra nếu self.userskhông trống, chỉ cần làm if self.users.
BrenBarn

4
Bạn isEmptythực sự trả về Truenếu khóa đầu tiên mang lại từ từ là đúng và trả về Falsenếu không. Nếu từ điển trống, nó trả về Nonekhông == False.
Hyperboreus

Câu lệnh if của bạn là ngược.
Nhà vật lý điên

hãy cẩn thận với các khóa giống như stackoverflow.com/a/17347421/1379762
Wajih

Câu trả lời:


737

Từ điển trống đánh giáFalse trong Python:

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

Do đó, isEmptychức năng của bạn là không cần thiết. Tất cả bạn cần làm là:

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 bạn liên kết là không liên quan: bool({False: False})vẫn đánh giá True. Liên kết bạn đưa ra tương ứng với anyphương thức, phụ thuộc vào khóa.
Ulysse BN

@Wajih điều đó có nghĩa là gì?
Charlie Parker

2
Tôi cảm thấy 'không chính tả' là không rõ ràng
imbatman

đồng ý, tôi cảm thấy thích sử dụng booleans và điều đó not <dict>cũng không rõ ràng
cryanbhu

130

Dưới đây là ba cách bạn có thể kiểm tra nếu dict trống. Tôi chỉ thích sử dụng cách đầu tiên mặc dù. Hai cách khác là quá dài dòng.

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
Thở dài ... mọi người đều thích "pythonic" và nhập ít ký tự nhất. Đầu tiên, một tiêu chí khác là khả năng đọc. Thứ hai, thử nghiệm đầu tiên trong câu trả lời ở trên là đúng không chỉ khi dict tồn tại và trống, mà còn nếu test_dict là Không có. Vì vậy, chỉ sử dụng thử nghiệm này khi bạn biết rằng đối tượng dict tồn tại (hoặc khi sự khác biệt không quan trọng). Cách thứ hai cũng có hành vi đó. Chỉ có cách thứ ba sủa nếu test_dict là Không có.
Andreas Maier

1
@AndreasMaier Chính xác là cảm giác của tôi. Ngoài ra, python được gõ động. Bên trong một hàm thường kiểm tra "nếu x là từ điển không trống, thì hãy làm điều này; nếu x là mảng numpy không trống, thì hãy làm điều đó". Sau đó, mã đầu tiên sẽ thất bại if xkhi x là mảng numpy
jf328

1
@Wajih liên kết của bạn vẫn không liên quan ở đây ... Xem tại sao
Ulysse BN

1
Không nâng cao điều này mặc dù đúng về mặt kỹ thuật do những lo ngại tôi chia sẻ. @AndreasMaier
Stunner

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

nếu độ dài bằng 0 nghĩa là dict rỗng


3
Mặc dù đoạn mã này có thể giải quyết câu hỏi, bao gồm một lời giải thích thực sự giúp cải thiện chất lượng bài đăng của bạn. Hãy nhớ rằng bạn đang trả lời câu hỏi cho độc giả trong tương lai và những người đó có thể không biết lý do cho đề xuất mã của bạn.
DimaSan

1
len(dict.keys())tương đương vớilen(dict)
pdpAxis

@pdpAxis Trong giá trị mà nó mang lại, mặc dù tôi cá là việc thực hiện dict.__len__có lẽ nhanh hơn một chút. :)
Mateen Ulhaq

6

Dưới đây là những cách đơn giản để kiểm tra một lệnh trống rỗng:

        a= {}

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

Mặc dù phương thức 1 nghiêm ngặt hơn khi a = Không, phương pháp 1 sẽ cung cấp kết quả chính xác nhưng phương pháp 2 sẽ cho kết quả không chính xác.


1

Một từ điển có thể được tự động chuyển thành boolean để đánh giá Falsecho từ điển trống và Truecho từ điển không trống.

if myDictionary: non_empty_clause()
else: empty_clause()

Nếu điều này có vẻ quá đặc biệt, bạn cũng có thể kiểm tra len(myDictionary)số không hoặc set(myDictionary.keys())cho một tập hợp trống hoặc chỉ đơn giản là kiểm tra sự bằng nhau với{} .

Hàm isEmpty không chỉ không cần thiết mà việc triển khai của bạn có nhiều vấn đề mà tôi có thể phát hiện ra prima-facie.

  1. Các return Falsetuyên bố được thụt vào một cấp độ quá sâu. Nó nên nằm ngoài vòng lặp for và cùng cấp với forcâu lệnh. Do đó, mã của bạn sẽ chỉ xử lý một khóa, được chọn tùy ý, nếu khóa tồn tại. Nếu một khóa không tồn tại, chức năng sẽ trở lạiNone , nó sẽ được chuyển thành boolean Sai. Ôi! Tất cả các từ điển trống sẽ được phân loại là giả từ.
  2. Nếu từ điển không trống, thì mã sẽ chỉ xử lý một khóa và trả lại giá trị của nó cho boolean. Bạn thậm chí không thể cho rằng cùng một khóa được đánh giá mỗi khi bạn gọi nó. Vì vậy, sẽ có dương tính giả.
  3. Hãy để chúng tôi nói bạn sửa lỗi thụt lề của return Falsecâu lệnh và đưa nó ra ngoài forvòng lặp. Sau đó, những gì bạn nhận được là boolean HOẶC của tất cả các khóa, hoặc Falsenếu từ điển trống. Tuy nhiên, bạn sẽ có dương tính giả và phủ định sai. Thực hiện chỉnh sửa và kiểm tra đối với từ điển sau đây để tìm bằng chứng.

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


-1

Bạn cũng có thể sử dụng get (). Ban đầu tôi tin rằng nó chỉ kiểm tra nếu khóa tồn tại.

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

Những gì tôi thích với get là nó không kích hoạt một ngoại lệ, vì vậy nó giúp dễ dàng vượt qua các cấu trúc lớn.


-4

Tại sao không sử dụng kiểm tra bình đẳng?

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

Trông giống như lỗi cú pháp và không hiển thị cách áp dụng kiểm tra trong ngữ cảnh của câu hỏi.
Roland Weber

-7

Sử dụng bất kỳ'

dict = {}

if any(dict) :

     # true
     # dictionary is not empty 

else :

     # false 
     # dictionary is empty

4
anykiểm tra xem dict có chứa bất kỳ khóa trung thực nào không, ví dụ any({0: 'something'})trả về Falsemặc dù dict không trống
Railslide

vâng rằng để tiết kiệm từ cả hai trường hợp, trung thực và trống rỗng, bool khôn ngoan khác sẽ đã đúng cho trường hợp trung thực. nếu bạn nghĩ trong mục đích mã hóa nói chung.
chhotu cá mòi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.