जवाबों:
ऐशे ही:
host = connectionDetails.get('host', someDefaultValue)
if/else
बहुत तेज़ है। वह भूमिका निभा सकता है या नहीं।
if/else
तेज है?
आप भी इस defaultdict
तरह का उपयोग कर सकते हैं :
from collections import defaultdict
a = defaultdict(lambda: "default", key="some_value")
a["blabla"] => "default"
a["key"] => "some_value"
आप लंबोदर के बजाय कोई भी सामान्य कार्य कर सकते हैं:
from collections import defaultdict
def a():
return 4
b = defaultdict(a, key="some_value")
b['absent'] => 4
b['key'] => "some_value"
get
या इसी तरह के तरीकों में फिट नहीं है ।
हालांकि .get()
यह एक अच्छा मुहावरा है, (यह धीमी है if/else
और try/except
अगर शब्दकोष में कुंजी की मौजूदगी से सबसे अधिक उम्मीद की जा सकती है) की तुलना में धीमी है :
>>> timeit.timeit(setup="d={1:2, 3:4, 5:6, 7:8, 9:0}",
... stmt="try:\n a=d[1]\nexcept KeyError:\n a=10")
0.07691968797894333
>>> timeit.timeit(setup="d={1:2, 3:4, 5:6, 7:8, 9:0}",
... stmt="try:\n a=d[2]\nexcept KeyError:\n a=10")
0.4583777282275605
>>> timeit.timeit(setup="d={1:2, 3:4, 5:6, 7:8, 9:0}",
... stmt="a=d.get(1, 10)")
0.17784020746671558
>>> timeit.timeit(setup="d={1:2, 3:4, 5:6, 7:8, 9:0}",
... stmt="a=d.get(2, 10)")
0.17952161730158878
>>> timeit.timeit(setup="d={1:2, 3:4, 5:6, 7:8, 9:0}",
... stmt="if 1 in d:\n a=d[1]\nelse:\n a=10")
0.10071221458065338
>>> timeit.timeit(setup="d={1:2, 3:4, 5:6, 7:8, 9:0}",
... stmt="if 2 in d:\n a=d[2]\nelse:\n a=10")
0.06966537335119938
if/then
तेज होगा। दोनों ही मामलों में एक देखने शब्दकोश की आवश्यकता होती है, और जब तक के आह्वान get()
है तो बहुत धीमी, और क्या मंदी के लिए खातों?
O(1)
शब्दकोश आकार की परवाह किए बिना है, इसलिए फ़ंक्शन कॉल ओवरहेड प्रासंगिक है।
कई अलग-अलग चूक के लिए यह प्रयास करें:
connectionDetails = { "host": "www.example.com" }
defaults = { "host": "127.0.0.1", "port": 8080 }
completeDetails = {}
completeDetails.update(defaults)
completeDetails.update(connectionDetails)
completeDetails["host"] # ==> "www.example.com"
completeDetails["port"] # ==> 8080
None
-वैल्यू को कुंजी-मूल्य वाले जोड़े में मूल्यों में से एक के रूप में या रिक्त स्ट्रिंग के साथ आपूर्ति की जाती है । defaults
शब्दकोश संभवतः अपने मूल्यों में से एक अनजाने बाहर blanked हो सकता था। (यह भी देखें stackoverflow.com/questions/6354436 )
ऐसा करने के लिए अजगर शब्दकोशों में एक विधि है: dict.setdefault
connectionDetails.setdefault('host',someDefaultValue)
host = connectionDetails['host']
हालांकि इस पद्धति का मूल्य सेट connectionDetails['host']
करने के लिए someDefaultValue
करता है, तो कुंजी host
पहले से ही परिभाषित नहीं है, क्या प्रश्न पूछा विपरीत है।
setdefault()
मान लौटाता है, इसलिए यह भी काम करता है host = connectionDetails.setdefault('host', someDefaultValue)
:। बस सावधान रहें कि connectionDetails['host']
यदि कुंजी पहले नहीं थी, तो यह डिफ़ॉल्ट मान पर सेट हो जाएगा ।
(यह एक देर से जवाब है)
एक विकल्प dict
वर्ग को उप- वर्ग करना और __missing__()
विधि को लागू करना है, जैसे:
class ConnectionDetails(dict):
def __missing__(self, key):
if key == 'host':
return "localhost"
raise KeyError(key)
उदाहरण:
>>> connection_details = ConnectionDetails(port=80)
>>> connection_details['host']
'localhost'
>>> connection_details['port']
80
>>> connection_details['password']
Traceback (most recent call last):
File "python", line 1, in <module>
File "python", line 6, in __missing__
KeyError: 'password'
पायथन 3.3.5 के लिए PyPy (5.2.0-Alpha0) की स्थिति के बारे में @Tim Pietzcker के संदेह का परीक्षण करना, मुझे लगता है कि वास्तव में दोनों .get()
और if
/ else
तरह समान प्रदर्शन करते हैं। वास्तव में ऐसा लगता है कि अगर / और मामले में केवल एक ही लुकअप है, तो स्थिति और असाइनमेंट में एक ही कुंजी शामिल है (पिछले मामले की तुलना में जहां दो लुकअप हैं)।
>>>> timeit.timeit(setup="d={1:2, 3:4, 5:6, 7:8, 9:0}",
.... stmt="try:\n a=d[1]\nexcept KeyError:\n a=10")
0.011889292989508249
>>>> timeit.timeit(setup="d={1:2, 3:4, 5:6, 7:8, 9:0}",
.... stmt="try:\n a=d[2]\nexcept KeyError:\n a=10")
0.07310474599944428
>>>> timeit.timeit(setup="d={1:2, 3:4, 5:6, 7:8, 9:0}",
.... stmt="a=d.get(1, 10)")
0.010391917996457778
>>>> timeit.timeit(setup="d={1:2, 3:4, 5:6, 7:8, 9:0}",
.... stmt="a=d.get(2, 10)")
0.009348208011942916
>>>> timeit.timeit(setup="d={1:2, 3:4, 5:6, 7:8, 9:0}",
.... stmt="if 1 in d:\n a=d[1]\nelse:\n a=10")
0.011475925013655797
>>>> timeit.timeit(setup="d={1:2, 3:4, 5:6, 7:8, 9:0}",
.... stmt="if 2 in d:\n a=d[2]\nelse:\n a=10")
0.009605801998986863
>>>> timeit.timeit(setup="d={1:2, 3:4, 5:6, 7:8, 9:0}",
.... stmt="if 2 in d:\n a=d[2]\nelse:\n a=d[1]")
0.017342638995614834
आप वन-लाइनर के रूप में इसके लिए लांबा फ़ंक्शन का उपयोग कर सकते हैं। एक नई वस्तु बनाएं connectionDetails2
जिसे एक फ़ंक्शन की तरह एक्सेस किया जाता है ...
connectionDetails2 = lambda k: connectionDetails[k] if k in connectionDetails.keys() else "DEFAULT"
अब उपयोग करें
connectionDetails2(k)
के बजाय
connectionDetails[k]
यदि k
कुंजी में शब्दकोश मूल्य वापस आता है, अन्यथा यह वापस आ जाता है"DEFAULT"