ตรวจสอบว่ามีรหัสที่กำหนดอยู่แล้วในพจนานุกรมหรือไม่


2683

ฉันต้องการทดสอบว่ามีคีย์อยู่ในพจนานุกรมหรือไม่ก่อนอัปเดตค่าสำหรับคีย์ ฉันเขียนรหัสต่อไปนี้:

if 'key1' in dict.keys():
  print "blah"
else:
  print "boo"

ฉันคิดว่านี่ไม่ใช่วิธีที่ดีที่สุดในการทำภารกิจนี้ให้สำเร็จ มีวิธีที่ดีกว่าในการทดสอบคีย์ในพจนานุกรมหรือไม่


31
การโทรdict.keys()สร้างรายการคีย์ตามเอกสารdocs.python.org/2/library/stdtypes.html#dict.keysแต่ฉันต้องแปลกใจหากรูปแบบนี้ไม่เหมาะสำหรับการแปลที่จริงจัง if 'key1' in dict:ไปยัง
Evgeni Sergeev

7
ดังนั้นในที่สุดผมก็พบว่าทำไมหลายสคริปต์หลามของฉันได้ช้าดังนั้น :) :(. นั่นเพราะผมได้รับการใช้x in dict.keys()เพื่อตรวจสอบคีย์. และที่เกิดขึ้นเพราะวิธีปกติในการย้ำกว่าคีย์ใน Java เป็นfor (Type k : dict.keySet())นิสัยนี้ก่อให้เกิดfor k in dict.keys()การ รู้สึกเป็นธรรมชาติมากกว่าfor k in dict(ซึ่งควรจะดีในแง่ของประสิทธิภาพ?) แต่จากนั้นการตรวจสอบปุ่มกลายเป็นif k in dict.keys()เกินไปซึ่งเป็นปัญหา ...
Evgeni Sergeev

4
@EvgeniSergeev if k in dict_:ทดสอบการปรากฏตัวของ k ในแป้นของ dict_ dict_.keys()เพื่อให้คุณยังคงไม่จำเป็นต้อง (มีบิตฉันตามที่อ่านให้ฉันชอบการทดสอบสำหรับค่าใน dict แต่มันไม่ได้.)
ToolmakerSteve

1
@ToolmakerSteve ถูกต้อง แต่ไม่เพียง แต่คุณไม่ต้องการมันไม่ใช่การปฏิบัติที่ดี
Evgeni Sergeev

26
ลอง "สำคัญในคำสั่ง"
marcelosalloum

คำตอบ:


3370

indictเป็นวิธีที่มีจุดมุ่งหมายเพื่อการทดสอบสำหรับการดำรงอยู่ของคีย์ในการ

d = {"key1": 10, "key2": 23}

if "key1" in d:
    print("this will execute")

if "nonexistent key" in d:
    print("this will not")

หากคุณต้องการค่าเริ่มต้นคุณสามารถใช้dict.get():

d = dict()

for i in range(100):
    key = i % 10
    d[key] = d.get(key, 0) + 1

และถ้าคุณต้องการให้แน่ใจว่าค่าเริ่มต้นสำหรับคีย์ใด ๆ คุณสามารถใช้dict.setdefault()ซ้ำ ๆ หรือdefaultdictจากcollectionsโมดูลเช่น:

from collections import defaultdict

d = defaultdict(int)

for i in range(100):
    d[i % 10] += 1

แต่โดยทั่วไปinคำสำคัญคือวิธีที่ดีที่สุด


74
ฉันมักจะใช้getถ้าฉันจะดึงรายการออกจากพจนานุกรมต่อไป ไม่มีความรู้สึกในการใช้in และดึงรายการออกจากพจนานุกรม
เจสันเบเกอร์

75
ฉันเห็นด้วยอย่างยิ่ง. แต่ถ้าคุณจำเป็นต้องรู้ว่ามีกุญแจอยู่หรือคุณต้องแยกความแตกต่างระหว่างกรณีที่มีการกำหนดคีย์และกรณีที่คุณใช้ค่าเริ่มต้นinเป็นวิธีที่ดีที่สุดในการทำมัน
Chris B.

5
การอ้างอิงสำหรับคำตอบนี้อยู่ที่ python docs
enkash

30
รับคือการทดสอบที่ไม่ดีถ้าคีย์เทียบเท่ากับ "เท็จ" 0เช่น เรียนรู้สิ่งนี้ยาก: /
เซบาสเตียน

4
ฉันไม่สามารถตกลงได้ว่านี่เป็นคำตอบที่สมบูรณ์เนื่องจากไม่ได้ระบุว่า 'ลอง' - 'ยกเว้น' จะเร็วที่สุดเมื่อจำนวนของคีย์ล้มเหลวมีน้อย ดูคำตอบนี้ด้านล่าง: stackoverflow.com/a/1602945/4376643
Craig Hicks

1546

คุณไม่ต้องกดปุ่มโทรออก:

if 'key1' in dict:
  print("blah")
else:
  print("boo")

ซึ่งจะเร็วกว่ามากเมื่อใช้การแฮชของพจนานุกรมเมื่อเทียบกับการค้นหาเชิงเส้นซึ่งจะมีการเรียกใช้คีย์


7
เป็นสิ่งที่ดี. ฉันอยู่ภายใต้ความประทับใจว่ามันจะยังคงสำรวจรายการของคีย์ภายใน แต่ฉันเห็นว่างานนี้เหมือนการทดสอบการเป็นสมาชิกในชุด
Mohan Gulati

51
@Mohan Gulati: คุณเข้าใจว่าพจนานุกรมเป็น hashtable ของคีย์ที่จับคู่กับค่าใช่มั้ย อัลกอริทึมการแปลงแป้นแปลงคีย์เป็นจำนวนเต็มและใช้จำนวนเต็มเพื่อค้นหาตำแหน่งในตารางแฮชที่ตรงกัน en.wikipedia.org/wiki/Hash_table
hughdbrown

5
@Charles Addis จากประสบการณ์การทำงานกับกุญแจครึ่งล้านปุ่มคุณจะได้รับการเพิ่มประสิทธิภาพอย่างน้อย 10 เท่าเมื่อเขียน "key in dict" แทน "key in dict.keys ()" PEP และ Zen ยังระบุด้วยว่าคุณควรเพิกเฉยในกรณีที่มันไม่ดีสำหรับโครงการของคุณ
ivan_bilan

11
ivan_bilan - ฉันเพิ่งจะทดสอบ bencht ของฉันเองในเรื่องนี้ ... ครึ่งล้านแป้นif key in d1ใช้0.17265701293945312เวลาไม่กี่วินาที การโทรif key in d1.keys()ใช้0.23871088027954102- นี่คือนิยามคลาสสิกของการเพิ่มประสิทธิภาพแบบไมโคร การประหยัด0.07884883880615234วินาทีไม่ได้เป็นการเพิ่มประสิทธิภาพ
ชาร์ลส์แอดดิส

11
@Eli เพียงเพื่อคุณฉันได้สร้างแบบทดสอบคุณสามารถรันด้วยตัวเอง ผลลัพธ์อาจทำให้คุณประหลาดใจ สำหรับ dicts ที่มี ~ 50,000 ปุ่มการโทรไม่ได้keys()ให้ประโยชน์ในการคำนวณ 0.1 วินาที สำหรับ ~ 500,000 แป้นการโทรไม่keys()ให้คุณได้รับประโยชน์ 0.1 วินาที สำหรับ ~ 5,000,000 กุญแจไม่โทรหาkeys()คือ 0.4 วินาทีเร็ว แต่สำหรับ 50,000,000 ปุ่มโทรkeys()คือ 3 วินาทีเร็ว!
Charles Addis

268

คุณสามารถทดสอบการมีอยู่ของคีย์ในพจนานุกรมโดยใช้คำหลักใน :

d = {'a': 1, 'b': 2}
'a' in d # <== evaluates to True
'c' in d # <== evaluates to False

การใช้งานทั่วไปสำหรับการตรวจสอบการมีอยู่ของคีย์ในพจนานุกรมก่อนที่จะทำการปิดการใช้งานนั้นคือการเริ่มต้นค่า (เช่นถ้าค่าของคุณเป็นรายการตัวอย่างเช่นและคุณต้องการให้แน่ใจว่ามีรายการว่างที่คุณสามารถต่อท้ายได้ เมื่อใส่ค่าแรกสำหรับคีย์) ในกรณีเช่นนั้นคุณอาจพบว่าเป็นcollections.defaultdict()ประเภทที่น่าสนใจ

ในโค้ดที่เก่ากว่าคุณอาจพบการใช้งานบางอย่างhas_key()ซึ่งเป็นวิธีที่เลิกใช้สำหรับการตรวจสอบการมีอยู่ของคีย์ในพจนานุกรม (เพียงใช้key_name in dict_nameแทน)


2
ต้องการแบ่งปันว่า (ใช้ Python 2.7) เวลาทำงานของบางสิ่งที่ฉันเพิ่งเขียนโดยอ้างอิงจาก dicts อย่างมากคือ 363.235070 โดยใช้ "คีย์ in dict.keys ()" และลงไปอย่างมากเพียง 0.260186 เพียงลบสายสำหรับ "คีย์ (เท่านั้น) ) "
Ido_f

@Ido_f โปรดโพสต์มาตรฐานของคุณเนื่องจากมาตรฐานของฉันแทบจะไม่มีความแตกต่างใน 3.5 และ 2.7
Charles Addis

@Ido_f ฉันสงสัยว่ามันเป็นอย่างอื่นในโปรแกรมของคุณว่าเป็นอย่างอื่น key in dict.keys()แต่ไม่จริง ลองลบรหัสทั้งหมดยกเว้นการตรวจสอบนี้และดูผลลัพธ์ของคุณ
Charles Addis

101

คุณสามารถย่อให้สั้นลงนี้:

if 'key1' in dict:
    ...

อย่างไรก็ตามนี่เป็นการปรับปรุงเครื่องสำอางที่ดีที่สุด ทำไมคุณถึงเชื่อว่านี่ไม่ใช่วิธีที่ดีที่สุด


100
นี้เป็นมากขึ้นกว่าการปรับปรุงเครื่องสำอาง เวลาในการค้นหาคีย์โดยใช้วิธีนี้คือ O (1) ในขณะที่คีย์การโทรจะสร้างรายการและเป็น O (n)
เจสันเบเกอร์

5
O (1) ดูไม่ถูกต้องนัก คุณแน่ใจหรือว่าไม่ใช่สิ่งที่ชอบ O (log n)
สเปกตรัม

12
มันเป็นความซับซ้อนของการค้นหา Dict เดียวซึ่งอยู่บน O เฉลี่ย (1) และที่เลวร้ายที่สุด O (n) .list () จะเป็น O (n) เสมอ wiki.python.org/moin/TimeComplexity
Leonora Tindall

1
นี้ยังหลีกเลี่ยงการจัดสรรพิเศษ (สำคัญสำหรับการทำลูปให้แน่นเร็วขึ้นนิดหน่อย)
นูเรตติน

56

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการประมวลผลความเร็วของวิธีที่เสนอตอบที่ยอมรับ (ลูป 10 ม.):

  • 'key' in mydict เวลาที่ผ่านไป 1.07 วินาที
  • mydict.get('key') เวลาที่ผ่านไป 1.84 วินาที
  • mydefaultdict['key'] เวลาที่ผ่านไป 1.07 วินาที

ดังนั้นการใช้inหรือมีการแนะนำกับdefaultdictget


6
เห็นด้วยทั้งหมดที่get's 1.84s คือ <1.07 * 2 ;-P
พอลความรุนแรง

54

ฉันอยากจะแนะนำให้ใช้setdefaultวิธีการแทน ดูเหมือนว่ามันจะทำทุกสิ่งที่คุณต้องการ

>>> d = {'foo':'bar'}
>>> q = d.setdefault('foo','baz') #Do not override the existing key
>>> print q #The value takes what was originally in the dictionary
bar
>>> print d
{'foo': 'bar'}
>>> r = d.setdefault('baz',18) #baz was never in the dictionary
>>> print r #Now r has the value supplied above
18
>>> print d #The dictionary's been updated
{'foo': 'bar', 'baz': 18}

9
สิ่งsetdefaultที่เกี่ยวข้องกับคำถามของ OP
hughdbrown

18
@hughdbrown "ฉันต้องการทดสอบว่ามีคีย์อยู่ในพจนานุกรมหรือไม่ก่อนที่จะอัปเดตค่าสำหรับคีย์" บางครั้งโพสต์มีรหัสที่สร้างความวุ่นวายในการตอบสนองต่อสิ่งที่ไม่ใช่เป้าหมายดั้งเดิม เพื่อให้บรรลุเป้าหมายที่ระบุไว้ในประโยคแรก setdefault เป็นวิธีที่มีประสิทธิภาพมากที่สุดแม้ว่าจะไม่ใช่การแทนที่แบบดรอปดาวน์สำหรับตัวอย่างโค้ดที่โพสต์
David Berger

5
นี่คือคำตอบที่เหนือกว่าเพราะเป็นไปตามเป้าหมายของ OP แทนที่จะให้คำตอบที่ถูกต้องทางเทคนิค ดู: nedbatchelder.com/blog/201207/…
Niels Bom

+1 สำหรับคำตอบที่ให้ข้อมูลที่สอนให้ฉันบางสิ่งบางอย่าง อย่างไรก็ตามไม่ว่าจะเป็นทางออกที่ดีที่สุดขึ้นอยู่กับสิ่งที่ coder มีอยู่ในใจ เช่นความหมายของ "ก่อนที่จะอัพเดตค่าของคีย์" บางทีเขาอาจจะโยนข้อยกเว้นหากไม่มีอยู่ (== ไม่ได้รับอนุญาตให้เพิ่มคีย์ใหม่) อาจเป็นพจนานุกรมของการนับและเขาจะบวก 1 ไปยังการนับที่มีอยู่ซึ่งในกรณีนี้ `d [key] = d.get (key, 0) + 1 'เป็นคำตอบที่สะอาดที่สุด (ดังที่ Chris แสดงหลังจากคำตอบของคุณ เขียน). (ฉันรำคาญกล่าวขวัญนี้ในอนาคตผู้อ่านกรณีมาที่นี่กับงานที่แตกต่างกันในใจ.)
ToolmakerSteve

1
@ToolmakerSteve True ปัญหาที่นี่คือคำถามของ OP ไม่ชัดเจนเพียงพอ
Niels Bom

45

พจนานุกรมในไพ ธ อนมีเมธอด get ('key', default) ดังนั้นคุณสามารถตั้งค่าเริ่มต้นในกรณีที่ไม่มีคีย์

values = {...}
myValue = values.get('Key', None)

33

สิ่งที่เกี่ยวกับการใช้ EAFP (ง่ายต่อการขอการอภัยมากกว่าการอนุญาต)

try:
   blah = dict["mykey"]
   # key exists in dict
except KeyError:
   # key doesn't exist in dict

ดูโพสต์ SO อื่น ๆ :

ใช้ try vs if ใน pythonหรือ

ตรวจสอบการมีอยู่ของสมาชิกใน Python


12
ลอง / ยกเว้นอาจมีราคาแพงกว่าถ้าเป็นไปได้ว่าคีย์มักไม่มีอยู่ จากโพสต์ที่คุณอ้างถึง: "[I] f คุณคาดหวังว่า 99% ของเวลาที่ผลลัพธ์จะมีสิ่งที่กล่าวซ้ำได้จริงฉันจะใช้วิธีลอง / ยกเว้นวิธีนี้จะเร็วขึ้นถ้าข้อยกเว้นพิเศษจริงๆหากผลลัพธ์ไม่มี มากกว่า 50% ของเวลาจากนั้นใช้ถ้าน่าจะดีกว่า [... ] [A] n หากคำสั่งเสียค่าใช้จ่ายเสมอคุณเกือบจะเป็นอิสระในการตั้งค่าบล็อกลอง / ยกเว้น แต่เมื่อข้อยกเว้นเกิดขึ้นจริง ค่าใช้จ่ายสูงกว่ามาก " stackoverflow.com/a/1835844/1094092
billrichards


20

วิธีที่คุณจะได้รับผลลัพธ์คือ:

  • ถ้า your_dict.has_key (คีย์) ถูกลบใน Python 3
  • ถ้าสำคัญใน your_dict
  • ลอง / ยกเว้นบล็อก

สิ่งไหนดีกว่านั้นขึ้นอยู่กับ 3 สิ่ง:

  1. พจนานุกรม 'ปกติมีคีย์' หรือ 'ปกติไม่มีคีย์'
  2. คุณตั้งใจจะใช้เงื่อนไขเช่นถ้า ... อื่น ๆ ... อย่างอื่นหรือไม่?
  3. พจนานุกรมมีขนาดใหญ่แค่ไหน

อ่านเพิ่มเติม: http://paltman.com/try-except-performance-in-python-a-simple-test/

ใช้ลอง / บล็อกแทน 'ใน' หรือ 'ถ้า':

try:
    my_dict_of_items[key_i_want_to_check]
except KeyError:
    # Do the operation you wanted to do for "key not present in dict".
else:
    # Do the operation you wanted to do with "key present in dict."

2
ดี แต่ต้องทำให้เป็นจริงสำหรับ python 3 ฉันแปลงสคริปต์ของหน้าเว็บด้วย2to3และเห็นว่าไม่มีการลองใช้ไวยากรณ์เร็วกว่าเสมอกับไวยากรณ์ลองแม้ว่าในกรณีที่คีย์อยู่ใน dict
Jean Paul

18

Python 2 เท่านั้น: (และสนับสนุน python 2.7 inแล้ว)

คุณสามารถใช้วิธี has_key ():

if dict.has_key('xyz')==1:
    #update the value for the key
else:
    pass

22
.has_key()ได้รับการเลิก ; คุณควรใช้inตามที่แสดงในคำตอบอื่น ๆ
แบรด Koch

12
BTW ผมขอแนะนำให้อ่านทุกคำตอบที่มีอยู่ไปยังOLDคำถามก่อนที่จะตอบมัน คำตอบนี้ไม่ได้เพิ่มอะไรเลยเนื่องจากมีคำแนะนำอยู่ในคำตอบของ Michael ตั้งแต่ '09 (ฉันไม่ได้ตั้งใจที่จะไม่สนับสนุนความพยายามในการเพิ่มสิ่งที่มีประโยชน์ให้กับการสนทนาลองต่อไป)
ToolmakerSteve

16

เพียงแค่ FYI เพิ่มไปยัง Chris B (คำตอบที่ดีที่สุด):

d = defaultdict(int)

ทำงานได้ดีเช่นกัน เหตุผลก็คือการโทรint()กลับ0ซึ่งเป็นสิ่งที่defaultdictอยู่เบื้องหลัง (เมื่อสร้างพจนานุกรม) ดังนั้นชื่อ "Factory Function" ในเอกสารประกอบ


2
หากคุณกำลังสร้างพจนานุกรมของการนับที่คุณควรจะใช้เคาน์เตอร์ (สมมติว่างูหลาม 2.7) และฉันใช้defaultdict(lambda: 0)แทนdefaultdict(int)เพราะฉันคิดว่ามันชัดเจนว่าเกิดอะไรขึ้น ผู้อ่านไม่จำเป็นต้องรู้ว่าคุณได้รับ0ถ้าคุณโทรint()โดยไม่มีข้อโต้แย้ง YMMV
Chris B.

9

ตรวจสอบว่ามีรหัสที่กำหนดอยู่แล้วในพจนานุกรมหรือไม่

เพื่อให้ได้แนวคิดว่าจะทำอย่างไรก่อนอื่นเราตรวจสอบวิธีการที่เราสามารถเรียกใช้พจนานุกรม นี่คือวิธีการ:

d={'clear':0, 'copy':1, 'fromkeys':2, 'get':3, 'items':4, 'keys':5, 'pop':6, 'popitem':7, 'setdefault':8, 'update':9, 'values':10}

Python Dictionary clear()       Removes all Items
Python Dictionary copy()        Returns Shallow Copy of a Dictionary
Python Dictionary fromkeys()    Creates dictionary from given sequence
Python Dictionary get()         Returns Value of The Key
Python Dictionary items()       Returns view of dictionary (key, value) pair
Python Dictionary keys()        Returns View Object of All Keys
Python Dictionary pop()         Removes and returns element having given key
Python Dictionary popitem()     Returns & Removes Element From Dictionary
Python Dictionary setdefault()  Inserts Key With a Value if Key is not Present
Python Dictionary update()      Updates the Dictionary 
Python Dictionary values()      Returns view of all values in dictionary

วิธีการที่โหดเหี้ยมเพื่อตรวจสอบว่ากุญแจมีอยู่แล้วอาจเป็นget()วิธีการ:

d.get("key")

อีกสองวิธีที่น่าสนใจitems()และkeys()ฟังดูเหมือนจะทำงานมากเกินไป ลองตรวจสอบดูว่าget()เป็นวิธีที่เหมาะสมสำหรับเราหรือไม่ เรามี พ.ร.บ. ของเราd:

d= {'clear':0, 'copy':1, 'fromkeys':2, 'get':3, 'items':4, 'keys':5, 'pop':6, 'popitem':7, 'setdefault':8, 'update':9, 'values':10}

การพิมพ์แสดงให้เห็นถึงกุญแจที่เรายังไม่ได้รับNone:

print(d.get('key')) #None
print(d.get('clear')) #0
print(d.get('copy')) #1

เราอาจใช้ข้อมูลนั้นเพื่อรับข้อมูลหากมีคีย์หรือไม่ แต่ให้พิจารณาสิ่งนี้หากเราสร้าง dict ด้วยซิงเกิลkey:None:

d= {'key':None}
print(d.get('key')) #None
print(d.get('key2')) #None

ชั้นนำที่เป็นวิธีการที่ไม่น่าเชื่อถือในกรณีค่าบางอย่างอาจจะget() Noneเรื่องนี้ควรจบลงอย่างมีความสุข หากเราใช้เครื่องมือinเปรียบเทียบ:

print('key' in d) #True
print('key2' in d) #False

เราได้ผลลัพธ์ที่ถูกต้อง เราอาจตรวจสอบรหัสไบต์ Python:

import dis
dis.dis("'key' in d")
#   1           0 LOAD_CONST               0 ('key')
#               2 LOAD_NAME                0 (d)
#               4 COMPARE_OP               6 (in)
#               6 RETURN_VALUE

dis.dis("d.get('key2')")
#   1           0 LOAD_NAME                0 (d)
#               2 LOAD_METHOD              1 (get)
#               4 LOAD_CONST               0 ('key2')
#               6 CALL_METHOD              1
#               8 RETURN_VALUE

นี้แสดงให้เห็นว่าinผู้ประกอบการเปรียบเทียบไม่ได้เป็นเพียงความน่าเชื่อถือ get()แต่ถึงแม้จะเร็วกว่า


.get()สามารถมีอาร์กิวเมนต์ที่สองสำหรับdefaultค่าที่ couldbe key:Noneใช้ในการจัดการปัญหาที่ ตัวอย่าง: d.get("key", False)
Alex

.get()เป็นวิธีที่เร็วที่สุด ตัวเลือกอื่นคือการกำหนดในtry/ exceptบล็อก
HCLivess

7

__contains__งูหลามพจนานุกรมมีวิธีการที่เรียกว่า วิธีการนี้จะคืนค่าจริงถ้าพจนานุกรมมีรหัสอื่นคืนเท็จ

 >>> temp = {}

 >>> help(temp.__contains__)

Help on built-in function __contains__:

__contains__(key, /) method of builtins.dict instance
    True if D has a key k, else False.

2
เป็นวิธีปฏิบัติที่เลวร้ายมากในการโทรติดต่อ__contains__โดยตรง วิธีที่ถูกต้องในการทำคือใช้inโอเปอเรเตอร์ซึ่งเป็นฟังก์ชันcontainment checkที่เรียกใช้ __contains__
user1767754

@ user1767754 foo = x['foo'] if x.__contains__('foo') else 'bar'ฉันใช้ แนวคิดใดบ้างที่อาจใช้inโอเปอเรเตอร์เป็นส่วนหนึ่งของนิพจน์นี้
donrondadon

1
foo = x['foo'] if 'foo' in x else 'bar'
เรย์วู

5

แบ่งปันวิธีการตรวจสอบอีกวิธีว่ามีกุญแจอยู่หรือไม่โดยใช้โอเปอเรเตอร์บูลีน

d = {'a': 1, 'b':2}
keys = 'abcd'

for k in keys:
    x = (k in d and 'blah') or 'boo'
    print(x) 

ผลตอบแทนนี้

>>> blah
>>> blah
>>> boo
>>> boo

คำอธิบาย

แรกที่คุณควรรู้ว่าในหลาม0, หรือวัตถุที่มีความยาวเป็นศูนย์ประเมินNone ทุกสิ่งทุกอย่างที่จะประเมินFalse Trueการดำเนินการบูลีนได้รับการประเมินจากซ้ายไปขวาและส่งคืนตัวถูกดำเนินการไม่เป็นจริงหรือเท็จ

ลองดูตัวอย่าง:

>>> 'Some string' or 1/0 
'Some string'
>>>

ตั้งแต่'Some string'ประเมินถึงTrueส่วนที่เหลือorจะไม่ถูกประเมินและไม่มีการหารด้วยข้อผิดพลาดที่ศูนย์

แต่ถ้าเราเปลี่ยนคำสั่ง1/0จะถูกประเมินก่อนและทำให้เกิดข้อยกเว้น:

>>> 1/0 or 'Some string'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero
>>> 

เราสามารถใช้สำหรับรูปแบบสำหรับการตรวจสอบถ้าคีย์ที่มีอยู่

(k in d and 'blah')

ทำเช่นเดียวกัน

if k in d:
    'blah'
else:
    False

การดำเนินการนี้จะส่งคืนผลลัพธ์ที่ถูกต้องหากมีคีย์อยู่แล้ว แต่เราต้องการให้พิมพ์ 'boo' เมื่อไม่มี ดังนั้นเราจึงนำผลลัพธ์มาพิจารณาorด้วย'boo'

>>> False or 'boo'
'boo'
>>> 'blah' or 'boo'
'blah'
>>> 

1

คุณสามารถใช้การforวนซ้ำเพื่อทำซ้ำพจนานุกรมและรับชื่อของคีย์ที่คุณต้องการค้นหาในพจนานุกรมหลังจากตรวจสอบว่ามีอยู่หรือไม่ใช้ifเงื่อนไข:

dic = {'first' : 12, 'second' : 123}
for each in dic:
    if each == 'second': 
        print('the key exists and the corresponding value can be updated in the dictionary')

ตรวจสอบผ่านรหัสเพราะการส่งออกสำหรับเรื่องนี้คือit is existและnot exist
system123456

ทำไมต้องใช้พจนานุกรมเลยหากจะทำการค้นหาเชิงเส้น?
Jean-François Fabre
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.