ruby remove same value multiple keys in hash -


निम्नलिखित हैश से

  हैश = {"a" = & gt; 100, "b "= & Gt; 200," c "= & gt; 100," d "= & gt; 120," ई "= & gt; 400, "f" = & gt; 430, "g" = & gt; 500}   

मैं सभी युग्म ("कुंजी", "मूल्य") को एक ही "मान" "या 50 के (" मूल्य "के) भिन्न हैं उदाहरण के लिए, ए = & gt; 100 और c = & gt; 100 को हटा दिया जाना चाहिए, क्योंकि वे समान "मूल्य" हैं और d = & gt; 120 को भी हटा दिया जाना चाहिए क्योंकि 100 और 120 के बीच का अंतर 20 है। 400 और 430 को भी हटा दिया जाना चाहिए क्योंकि अंतर 30 है।

मुझे केवल

हैश ["बी" = & gt; 200, "g" = & gt; 500]

सिर्फ एक उदाहरण के ऊपर, वास्तविकता में, मेरे पास 33,000 कुंजियां हैंश हैं I

हैश की कुंजी / मान जोड़े की एक जोड़ी, k1 = & gt; v1 और k2 = & gt; v2 , अगर (v1-v2) .abs & lt; = 50 हटाए जाने के लिए दोनों हैं। इसमें जोड़ी के लिए v1 == v2 शामिल है, इसलिए हमें अलग-अलग पर विचार नहीं करना चाहिए। मैं इसे पहले रखने के लिए कुंजी की एक सरणी बनाकर करूँगा, फिर मूल हैश से संबंधित कुंजी / मान युग्मों से बना हैश बनाएं।

कोड <पूर्व> key_to_keep = hash.keys - hash.sort_by {| _, v | V} .each_cons (2) .each_with_object ([]) {| ((1, वी 1), (2, 2, v2)), एक | एक & lt; & lt; के 1 और लेफ्टिनेंट; & lt; K2 यदि (v1-v2) .bbs & lt; = 50} keys_to_keep.zip (हैश.वल्यूस_ैट (* keys_to_keep))। To_h

स्पष्टीकरण <पूर्व> हैश = {"ए" = & gt; 100, "b" = & gt; 200, "c" = & gt; 100, "d" = & gt; 120}

हैश मानों के आधार पर क्रमबद्ध करें:

  b = hash.sort_by {| _, v | v} # = & gt; [["ए", 100], ["सी", 100], ["डी", 120], ["बी", 200]]   

अगला, एक b :

  c = b.each_cons (2) # = & gt; के तत्वों के सभी आसन्न जोड़े की सरणी # & Lt; एननामेटर: # [["एक", 100], ["c", 100], ["d", 120], ["b", 200]]: प्रत्येक_cons (2) & gt;   

इस गणक की सामग्री को देखने के लिए:

  c.to_a # = & gt; [[["ए", 100], ["सी", 100]], # [["सी", 100], ["डी", 120]], # [["डी", 120], ["   

अब हटाए जाने वाले कुंजियों का एक सरणी बनाएं (डुप्लिकेट ठीक)

  d = c.each_with_object ([] ) {| ((1, वी 1), (के 2, वी 2)), एक | एक & lt; & lt; के 1 और लेफ्टिनेंट; & lt; K2 अगर (v1-v2) .abs & lt; = 50} # = & gt;  डी  की गणना करने के लिए, गणक द्वारा ब्लॉक में दिए गए पहले मान पर विचार करें ["a", "c", "c", "d"]   

c :

  k1 = & gt; "a" v1 = & gt; 100 के 2 = & gt; "सी" वी 2 = & gt; 100   

चूंकि

  (100 - 100) .bbs & lt; = 50   

कुंजी k1 और k2 हटाए जाने के लिए कुंजी की सरणी में जोड़ा जाता है (ब्लॉक वैरिएबल a )। ब्लॉक को दिया गया अगला मान है:

  k1 = & gt; "c" v1 = & gt; 100 के 2 = & gt; "डी" वी 2 = & gt; 120   

से

  (100 - 120) .bbs & lt; = 50   

कुंजी "C" और "d" को भी a में जोड़ दिया जाता है। तीसरा मान a के बाद से

  (120 - 200) .bs & gt; 50   

अब सेट अंतर का उपयोग करके रखने के लिए कुंजी की एक सरणी का निर्माण:

  e = hash.keys # = & gt; ["A", "b", "c", "d"] keys_to_keep = e - d # = & gt; ["B"]   

रखने के लिए कुंजी के लिए मूल्यों को बाहर निकालें:

  f = hash.values_at (* keys_to_keep) # = & gt ; [200]   

रखने के लिए कुंजी / मान जोड़े की एक सरणी का निर्माण:

  g = keys_to_keep.zip (f) # = & gt; [["बी", 200]]   

एक हैश में परिवर्तित करें।

  g.to_h # रूबी v.2.0 + # = & gt; {"B" = & gt; 200}   

या

  हैश [g] # = & gt; {"B" = & gt; 200}    

Comments

Popular posts from this blog

Verilog Error: output or inout port "Q" must be connected to a structural net expression -

jasper reports - How to center align barcode using jasperreports and barcode4j -

c# - ASP.NET MVC - Attaching an entity of type 'MODELNAME' failed because another entity of the same type already has the same primary key value -