Python: ตรวจสอบว่า 'พจนานุกรม' ว่างเปล่าดูเหมือนจะไม่ทำงาน


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ถ้าคีย์แรกที่ได้จากพจนานุกรมนั้นเป็นจริงและส่งกลับเป็นFalseอย่างอื่น ถ้าพจนานุกรมที่ยังว่างอยู่ก็จะส่งกลับซึ่งไม่ได้เป็นNone == False
Hyperboreus

คำสั่ง if ของคุณย้อนกลับ
นักฟิสิกส์บ้า

ระวังคีย์ที่มีลักษณะเหมือน false stackoverflow.com/a/17347421/1379762
Wajih

คำตอบ:


737

พจนานุกรมที่ว่างเปล่าประเมินเป็นFalse Python:

>>> 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
ฉันรู้สึกว่า 'not dict' ไม่ชัดเจน
imbatman

ตกลงฉันรู้สึกเหมือนใช้ booleans และ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 ไม่มี
Andreas Maier

1
@ AndreasMaier ความรู้สึกของฉันก็เหมือนกัน นอกจากนี้หลามยังพิมพ์แบบไดนามิก ภายในฟังก์ชั่นเป็นเรื่องธรรมดาที่จะตรวจสอบ "ถ้า x เป็นพจนานุกรมที่ไม่ว่างเปล่าแล้วทำสิ่งนี้ถ้า x เป็นอาร์เรย์ numpy ที่ไม่ว่างเปล่าให้ทำเช่นนั้น" จากนั้นโค้ดแรกจะล้มเหลวif xเมื่อ x เป็นอาร์เรย์ที่ไม่มีค่า
jf328

1
@Wajih คุณลิงก์ยังไม่เกี่ยวข้องที่นี่ ... ดูว่าทำไม
Ulysse BN

1
ไม่ต้องอัปโหลดสิ่งนี้แม้ว่าจะถูกต้องทางเทคนิคเนื่องจากความกังวลที่ฉันแบ่งปันด้วย @AndreasMaier
Stunner

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

ถ้าความยาวเป็นศูนย์หมายความว่า 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')

แม้ว่าวิธีที่ 1 จะเข้มงวดกว่าเมื่อ = ไม่มีวิธีที่ 1 จะให้ผลลัพธ์ที่ถูกต้อง แต่วิธีที่ 2 จะให้ผลลัพธ์ที่ไม่ถูกต้อง


1

พจนานุกรมสามารถส่งไปยังบูลีนอัตโนมัติซึ่งประเมินค่าเป็นFalseพจนานุกรมว่างเปล่าและพจนานุกรมที่Trueไม่ว่างเปล่า

if myDictionary: non_empty_clause()
else: empty_clause()

หากสิ่งนี้ดูเป็นสำนวนเกินไปคุณสามารถทดสอบlen(myDictionary)ศูนย์หรือset(myDictionary.keys())เซตว่างหรือทดสอบความเท่าเทียมกัน{}ได้

ฟังก์ชั่น isEmpty ไม่เพียง แต่ไม่จำเป็นเท่านั้น แต่ยังมีการใช้งานของคุณที่มีปัญหาหลายอย่างที่ฉันสามารถสังเกตเห็นเบื้องต้นได้

  1. return Falseคำสั่งเยื้องหนึ่งระดับลึกเกินไป มันควรอยู่นอก for for loop และอยู่ในระดับเดียวกับforคำสั่ง ดังนั้นรหัสของคุณจะประมวลผลคีย์เดียวที่เลือกโดยพลการหากมีคีย์อยู่ หากไม่มีคีย์ฟังก์ชันจะส่งคืนNoneซึ่งจะถูกส่งไปยังบูลีน False อุ๊ย! พจนานุกรมที่ว่างเปล่าทั้งหมดจะถูกจัดประเภทเป็นเท็จ -nagatives
  2. หากพจนานุกรมไม่ว่างเปล่ารหัสจะประมวลผลเพียงหนึ่งคีย์และส่งคืนค่าการร่ายเป็นบูลีน คุณไม่สามารถสันนิษฐานได้ว่ามีการประเมินรหัสเดียวกันทุกครั้งที่คุณเรียกใช้ ดังนั้นจะมีผลบวกที่ผิดพลาด
  3. ให้เราบอกว่าคุณแก้ไขการเยื้องของreturn Falseคำสั่งและนำมาไว้นอกforวง สิ่งที่คุณจะได้คือบูลีนหรือของปุ่มทั้งหมดหรือFalseถ้าพจนานุกรมว่างเปล่า ยังคุณจะมีผลบวกปลอมและเชิงลบเท็จ ทำการแก้ไขและทดสอบกับพจนานุกรมต่อไปนี้เพื่อเป็นหลักฐาน

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


-1

คุณยังสามารถใช้รับ () ตอนแรกฉันเชื่อว่ามันจะตรวจสอบเฉพาะคีย์ที่มีอยู่

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

สิ่งที่ฉันชอบเมื่อรับคือมันไม่ทำให้เกิดข้อยกเว้นดังนั้นจึงทำให้ง่ายต่อการสำรวจโครงสร้างขนาดใหญ่


-4

ทำไมไม่ใช้การทดสอบความเท่าเทียมกัน?

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

ที่ดูเหมือนข้อผิดพลาดทางไวยากรณ์และไม่แสดงวิธีใช้การตรวจสอบในบริบทของคำถาม
Roland Weber

-7

ใช้ 'ใด ๆ '

dict = {}

if any(dict) :

     # true
     # dictionary is not empty 

else :

     # false 
     # dictionary is empty

4
anyตรวจสอบว่า dict มีคีย์ความจริงใด ๆ เช่นany({0: 'something'})ส่งคืนFalseแม้ว่า dict จะไม่ว่างเปล่า
Railslide

ใช่ว่าจะช่วยให้พ้นจากทั้งสองกรณีความจริงและความว่างเปล่าบูลฉลาดอื่น ๆ จะให้ความจริงกับคดีจริง ถ้าคุณคิดในวัตถุประสงค์การเข้ารหัสทั่วไป
chhotu sardar
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.