2014-04-03 9 views
10

पाइथन में एक शब्दकोश/हैश कुंजी को पढ़ना संभव है, जबकि एक ही समय में डिफ़ॉल्ट मान पर कुंजी सेट करना संभव है यदि कोई पहले से मौजूद नहीं है।रूबी हैश पाइथन dict setdefault

उदाहरण के लिए:

>>> d={'key': 'value'} 
>>> d.setdefault('key', 'default') 
'value'           # returns the existing value 
>>> d.setdefault('key-doesnt-exist', 'default') 
'default'          # sets and returns default value 
>>> d 
{'key-doesnt-exist': 'default', 'key': 'value'} 

वहाँ हैश रूबी के साथ एक बराबर है? यदि नहीं, रूबी में मूर्खतापूर्ण दृष्टिकोण क्या है?

उत्तर

8

एक हैश डिफ़ॉल्ट मान सकते हैं या एक डिफ़ॉल्ट प्रक्रिया (जिसे कुंजी अनुपस्थित होने पर बुलाया जाता है)।

h = Hash.new("hi") 
puts h[123] #=> hi 
# change the default: 
h.default = "ho" 

उपरोक्त मामले में हैश खाली रहता है।

h = Hash.new{|h,k| h[k] = []} 
h[123] << "a" 
p h # =>{123=>["a"]} 

Hash.new([]) काम नहीं किया है, क्योंकि एक ही सरणी (समान वस्तु के रूप में ही) प्रत्येक कुंजी के लिए इस्तेमाल किया जाएगा।

+0

+1 मैं सिर्फ यह जवाब लिख रहा था। आपने मुझे हराया :) –

2

पायथन में इस समारोह के बराबर नहीं है।

class Hash 

    def setdefault(key, value) 
    if self[key].nil? 
     self[key] = value 
    else 
     self[key] 
    end 
    end 

end 

h = Hash.new 
h = { 'key' => 'value' } 
h.setdefault('key', 'default') 
# => 'value' 
h.setdefault('key-doesnt-exist', 'default') 
# => 'default' 

लेकिन ध्यान रखें कि बंदर पैचिंग अक्सर एक वर्जित, कम से कम कुछ कोड के वातावरण में के रूप में देखा जाता है में रखना: आप हमेशा इस कार्यक्षमता प्राप्त करने के लिए बंदर पैचिंग उपयोग कर सकते हैं।

बंदर पैचिंग का सुनहरा नियम लागू होता है: सिर्फ इसलिए कि आप कर सकते हैं, का मतलब यह नहीं है कि आपको चाहिए।

अधिक मूर्खतापूर्ण तरीका अतिरिक्त ब्लॉक या मान पास करके Hash constructor के माध्यम से डिफ़ॉल्ट मानों को परिभाषित करना है।

+0

upvoted के लिए

h = {} h['key'] ||= 'value' 

रूबी बिंदु घर ड्राइव करने के लिए जारी रखा:

एक ही समय में, हम वर्तमान में सिर्फ SetDefault इस तरह करता है कि क्या करना वे जो समान व्यवहार चाहते हैं। धन्यवाद। – gabrtv

1

आप कर सकते हैं बस pass a block to the Hash constructor:

hash = Hash.new do |hash, key| 
    hash[key] = :default 
end 

जब किसी गैर-मौजूद कुंजी एक्सेस करने के प्रयास किया जाता है ब्लॉक सक्रिय किया जाएगा। यह हैश ऑब्जेक्ट और कुंजी पारित किया जाएगा। आप उनके साथ जो चाहें वो कर सकते हैं; डिफ़ॉल्ट मान के लिए कुंजी सेट कुंजी से एक नया मूल्य व्युत्पन्न, आदि

आप पहले से ही एक Hash वस्तु है, तो आप the default_proc= method उपयोग कर सकते हैं:

hash = { key: 'value' } 

# ... 

hash.default_proc = proc do |hash, key| 
    hash[key] = :default 
end 
+0

आम तौर पर हम इसे कई पंक्तियों पर 'do ... end' के बजाय, एक पंक्ति पर '{...}' का उपयोग करके लिखे गए देखते हैं। –

3

यहां एक मृत घोड़े को मारना नहीं है, लेकिन सेटडिफॉल्ट एक हैश पर लाने की तरह काम करता है। यह हैश पर डिफ़ॉल्ट तरीके से कार्य नहीं करता है। एक बार जब आप हैश पर डिफ़ॉल्ट सेट करते हैं, तो कोई भी लापता कुंजी उस डिफ़ॉल्ट मान का उपयोग करेगी। SetDefault के साथ यह मामला नहीं है। यह केवल एक लापता कुंजी के लिए मान संग्रहीत करता है और केवल तभी जब वह उस कुंजी को ढूंढने में विफल रहता है। वह पूरा स्टोर नया कुंजी मूल्य जोड़ी टुकड़ा है जहां यह लाने से अलग है।

h.default = "Hey now" 
h.fetch('key', 'default')      # => 'value' 
h.fetch('key-doesnt-exist', 'default')   # => 'default' 
# h => {'key' => 'value'} 
h['not your key']        # => 'Hey now' 

पायथन:

h = {'key':'value'} 
h.setdefault('key','default')     # => 'value' 
h.setdefault('key-doesnt-exist','default')  # => 'default' 
# h {'key': 'value', 'key-doesnt-exist': 'default'} 
h['not your key']        # => KeyError: 'not your key' 
+1

रूबी का 'fetch' पाइथन की ['get'] (https://docs.python.org/2/library/stdtypes.html#dict.get) की तरह व्यवहार करता है जब आप इसे' डिफ़ॉल्ट 'देते हैं मूल्य। 'setdefault' का लाभ यह है कि * बाद में * कोड की रेखाएं यह पहले से ही मान सकती हैं और यह मान सकती हैं कि' dict' में स्पष्ट रूप से जोड़े गए लोगों के अलावा कोई कुंजी नहीं है, जो कोड क्लीनर को पढ़ने और प्रबंधित करने में आसान बनाता है। – jpmc26

संबंधित मुद्दे