यदि कोई शब्दकोष (अजगर) में कोई मान मौजूद है तो कैसे जांच करें


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'>

EDIT2: टिप्पणियों में अनुरोध के अनुसार ...

>>> 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
जब तक कि बड़े तानाशाह पर न चला जाए, तब तक यह बकवास नहीं था। मुझे लगता है कि मूल्यों में ओवरहेड () मूल्य सूची की प्रतिलिपि बनाने और दृश्य को बनाए रखने के द्वारा व्यूवल्यूज़ () में होता है।

के छोटे आकार को देखते हुए d, समय प्रभावी रूप से अर्थहीन है। पायथन 3 में, dict.values()डिफॉल्ट रूप से एक डिक्शनरी व्यू है, dict.itervalues()और dict.viewvalues()चले गए हैं। आप इसे (एक बड़े शब्दकोश के साथ) फिर से परीक्षण कर सकते हैं और list(d.values())पायथन 2 व्यवहार iter(d.values())प्राप्त करने के लिए और व्यवहार प्राप्त करने के लिए उपयोग कर सकते dict.itervalues()हैं, लेकिन क्योंकि उन दोनों संस्करणों को वैश्विक खोज और कॉल की आवश्यकता होती है, वे बिल्कुल धीमे होंगे। दोनों अतिरिक्त काम करते हैं जिनकी जरूरत नहीं है।
मार्टिन पीटर्स

33

आप उपयोग कर सकते हैं

"one" in d.itervalues()

यदि "one"आपके शब्दकोश के मूल्यों में से एक है तो परीक्षण करना ।


22

पायथन डिक्शनरी में (कुंजी) फंकियन मिला है

>>> 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
सवाल का जवाब नहीं देता। ओपी ने मूल्य के बारे में पूछा key:valueऔर चाबी नहीं।
अक्षयनागपाल

10

शब्दकोश दृश्यों का उपयोग करें:

if x in d.viewvalues():
    dosomething()..

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 ...)जिसे आप किसी और चीज के लिए उपयोग नहीं करते हैं, और जब मूल्य मिल गया है, तो शॉर्ट-सर्किट के लिए।
मार्टिन पीटर्स

0

पायथन 3 में आप values()डिक्शनरी के फ़ंक्शन का उपयोग कर सकते हैं । यह मूल्यों की एक दृश्य वस्तु देता है। यह बदले में, iterफ़ंक्शन को पारित किया जा सकता है जो एक पुनरावृत्ति वस्तु देता है। इस तरह से इटरेटर की जाँच की जा सकती है in,

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

या आप दृश्य ऑब्जेक्ट का उपयोग सीधे कर सकते हैं क्योंकि यह सूची के समान है

'one' in d.values()

1
शब्दकोश दृश्य पर उपयोग करने का कोई मतलब नहीं हैiter() ; inऑब्जेक्ट को पहले से ही उपयोग करने योग्य के रूप में उपयोग करेगा (प्रकार एक समर्पित __contains__पद्धति को लागू नहीं करता है )। केवल के बीच का अंतर 'one' in iter(d.values())और 'one in d.values()है कि आप अजगर अतिरिक्त काम (के लिए एक वैश्विक देखने की लागत का भुगतान कर बनाई गई है iter)।
मार्टिन पीटर्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.