วิธีตรวจสอบว่ามีค่าอยู่ในพจนานุกรม (หลาม) หรือไม่


251

ฉันมีพจนานุกรมต่อไปนี้ในหลาม:

d = {'1': 'one', '3': 'three', '2': 'two', '5': 'five', '4': 'four'}

ฉันต้องการวิธีค้นหาว่ามีค่าเช่น "หนึ่ง" หรือ "สอง" อยู่ในพจนานุกรมนี้หรือไม่

ตัวอย่างเช่นหากฉันต้องการทราบว่ามีดัชนี "1" อยู่หรือไม่ฉันจะต้องพิมพ์:

"1" in d

แล้วหลามก็จะบอกฉันว่ามันเป็นเรื่องจริงหรือเท็จ แต่ฉันต้องทำสิ่งที่แน่นอนแบบเดียวกันยกเว้นเพื่อค้นหาว่ามีค่าอยู่หรือไม่

คำตอบ:


381
>>> d = {'1': 'one', '3': 'three', '2': 'two', '5': 'five', '4': 'four'}
>>> 'one' in d.values()
True

จากความอยากรู้บางช่วงเวลาเปรียบเทียบ:

>>> T(lambda : 'one' in d.itervalues()).repeat()
[0.28107285499572754, 0.29107213020324707, 0.27941107749938965]
>>> T(lambda : 'one' in d.values()).repeat()
[0.38303399085998535, 0.37257885932922363, 0.37096405029296875]
>>> T(lambda : 'one' in d.viewvalues()).repeat()
[0.32004380226135254, 0.31716084480285645, 0.3171098232269287]

แก้ไข:และในกรณีที่คุณสงสัยว่าทำไม ... เหตุผลก็คือวัตถุแต่ละชนิดข้างต้นส่งคืนวัตถุประเภทต่าง ๆ ซึ่งอาจหรืออาจไม่เหมาะสำหรับการค้นหา:

>>> type(d.viewvalues())
<type 'dict_values'>
>>> type(d.values())
<type 'list'>
>>> type(d.itervalues())
<type 'dictionary-valueiterator'>

แก้ไข 2:ตามคำขอในความคิดเห็น ...

>>> T(lambda : 'four' in d.itervalues()).repeat()
[0.41178202629089355, 0.3959040641784668, 0.3970959186553955]
>>> T(lambda : 'four' in d.values()).repeat()
[0.4631338119506836, 0.43541407585144043, 0.4359898567199707]
>>> T(lambda : 'four' in d.viewvalues()).repeat()
[0.43414998054504395, 0.4213531017303467, 0.41684913635253906]

ฉันไม่มีไพ ธ อนอยู่คุณสามารถทำการทดสอบด้วย 'สี่' แทน 'หนึ่ง' ได้หรือไม่?
Soulcheck

2
มันไม่ได้เป็นสิ่งจำเป็นหลังจากทั้งหมดเว้นแต่จะทำงานใน dict ที่ใหญ่กว่า ฉันเดาค่าใช้จ่ายในค่า () เกิดจากการคัดลอกรายการค่าและในมุมมอง () โดยรักษามุมมองที่ยังมีชีวิตอยู่
Soulcheck

ด้วยขนาดที่เล็กdการกำหนดเวลาจึงไม่มีความหมายอย่างมีประสิทธิภาพ ใน Python 3 dict.values()เป็นมุมมองพจนานุกรมโดยค่าเริ่มต้นและdict.itervalues()และdict.viewvalues()จะหายไป คุณสามารถทดสอบสิ่งนี้อีกครั้ง (ด้วยพจนานุกรมที่ใหญ่กว่า) และใช้list(d.values())เพื่อให้ได้ลักษณะการทำงานของ Python 2 และiter(d.values())เพื่อให้ได้dict.itervalues()พฤติกรรม แต่เนื่องจากทั้งสองเวอร์ชันนั้นต้องการการค้นหาและโทรติดต่อแบบโกลบอล ทั้งสองทำงานพิเศษที่ไม่ต้องการ
Martijn Pieters


22

Python Dictionary มีfuncion (สำคัญ)

>>> d.get(key)

ตัวอย่างเช่น,

>>> d = {'1': 'one', '3': 'three', '2': 'two', '5': 'five', '4': 'four'}
>>> d.get('3')
'three'
>>> d.get('10')
none

หากคีย์ของคุณไม่มีอยู่จะส่งคืนnoneค่า

foo = d[key] # raise error if key doesn't exist
foo = d.get(key) # return none if key doesn't exist

เนื้อหาที่เกี่ยวข้องกับรุ่นน้อยกว่า 3.0 และมากกว่า 5.0 .


29
ไม่ตอบคำถาม OP ถามเกี่ยวกับค่าในkey:valueและไม่สำคัญ
akshaynagpal


4

ประเภทต่าง ๆ เพื่อตรวจสอบค่าที่มีอยู่

d = {"key1":"value1", "key2":"value2"}
"value10" in d.values() 
>> False

จะทำอย่างไรถ้ารายการของค่า

test = {'key1': ['value4', 'value5', 'value6'], 'key2': ['value9'], 'key3': ['value6']}
"value4" in [x for v in test.values() for x in v]
>>True

เกิดอะไรขึ้นถ้ารายการของค่าที่มีค่าสตริง

test = {'key1': ['value4', 'value5', 'value6'], 'key2': ['value9'], 'key3': ['value6'], 'key5':'value10'}
values = test.values()
"value10" in [x for v in test.values() for x in v] or 'value10' in values
>>True

อย่าใช้value in [... list comprehension over sequence ...]ใช้any(value in sequence ...)เพื่อหลีกเลี่ยงการสร้างรายการวัตถุที่คุณไม่ได้ใช้เพื่อสิ่งอื่นและลัดวงจรเมื่อพบค่า
Martijn Pieters

0

ใน Python 3 คุณสามารถใช้values()ฟังก์ชั่นของพจนานุกรม มันจะส่งกลับวัตถุมุมมองของค่า ในทางกลับกันนี้สามารถส่งผ่านไปยังiterฟังก์ชันที่ส่งกลับวัตถุตัววนซ้ำ ตัววนซ้ำสามารถตรวจสอบได้โดยใช้inเช่นนี้

'one' in iter(d.values())

หรือคุณสามารถใช้วัตถุมุมมองโดยตรงเนื่องจากคล้ายกับรายการ

'one' in d.values()

1
มีจุดใดในการใช้iter()ในมุมมองพจนานุกรม; inจะใช้วัตถุเป็น iterable แล้ว (ชนิดไม่ใช้__contains__วิธีการเฉพาะ) ข้อแตกต่างระหว่าง'one' in iter(d.values())และ'one in d.values()คือคุณทำให้ Python ทำงานพิเศษ (จ่ายค่าใช้จ่ายในการค้นหาทั่วโลกiter)
Martijn Pieters
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.