2012-06-05 26 views
19

पर्ल में, मैं मान द्वारा एक हैश की चाबी क्रमबद्ध करना चाहते हैं, संख्यानुसार:मूल्यों पर perl हैश को कैसे क्रमबद्ध करें और कुंजी को संगत रूप से क्रमबद्ध करें (शायद दो सरणी में)?

{ 
    five => 5 
    ten => 10 
    one => 1 
    four => 4 
} 

दो सरणियों उत्पादन:

(1,4,5,10) and (one, four, five, ten) 

और फिर मैं मान सरणी ऐसी है कि संख्या को सामान्य करना चाहते हैं अनुक्रमिक हैं:

(1,2,3,4) 

मैं यह कैसे कर सकता हूं?

उत्तर

45

संबंधित मूल्य से कुंजी को पहले क्रमबद्ध करें। फिर मान प्राप्त करें (उदाहरण के लिए हैश स्लाइस का उपयोग करके)।

my @keys = sort { $h{$a} <=> $h{$b} } keys(%h); 
my @vals = @h{@keys}; 

या यदि आपके पास हैश संदर्भ है।

my @keys = sort { $h->{$a} <=> $h->{$b} } keys(%$h); 
my @vals = @{$h}{@keys}; 
+2

यह आसान था। कभी-कभी उन अच्छे शॉर्टकट्स के साथ आना मुश्किल होता है। धन्यवाद Iikegami। – Moni

+0

आप [पर्ल में सॉर्ट फ़ंक्शन] में अधिक जानकारी देख सकते हैं (http: // stackoverflow।कॉम/प्रश्न/6454744/सॉर्ट-फ़ंक्शन-इन-पर्ल/6454804 # 6454804) –

2
my (@nums, @words); 
do { push @nums, shift @$_; 
    push @words, shift @$_; 
    } 
    foreach sort { $a->[0] <=> $b->[0] } 
      map { [ $h->{ $_ }, $_ ] } keys %$h 
    ; 
+0

क्या यह काम करता है? एक% एच के साथ टेस्ट लेकिन काम नहीं किया। – Moni

+0

@ मोनी, यह बहुत अच्छी तरह से काम करता है, जिस तरह से लिखा गया है। यदि आपको '% h' की आवश्यकता है तो यह मानचित्र में केवल 'कुंजी% h' और' $ h {$ _} 'है। – Axeman

3

कृपया पर्ल सामान्य प्रश्न प्रविष्टि शीर्षक "(कुंजी के बजाय मूल्य द्वारा वैकल्पिक रूप से) मैं एक हैश को क्रमबद्ध कैसे करूँ"

http://perldoc.perl.org/perlfaq4.html#How-do-I-sort-a-hash-%28optionally-by-value-instead-of-key%29?

तुम भी खोज करने के लिए perldoc -q उपयोग कर सकते हैं perldoc -q sort में स्थानीय रूप से आपकी मशीन पर अक्सर पूछे जाने वाले प्रश्न, जैसा कि मैंने आपका जवाब पाया।

5

मैं हैश को कैसे सॉर्ट करूं (वैकल्पिक रूप से कुंजी के बजाय मूल्य से)?

हैश को सॉर्ट करने के लिए, चाबियों से शुरू करें। इस उदाहरण में, हम सॉर्ट फ़ंक्शन को कुंजियों की सूची देते हैं जो तब उन्हें ASCIIBetically तुलना करता है (जो आपकी लोकेल सेटिंग्स से प्रभावित हो सकता है)। आउटपुट सूची में ASCIIBetical ऑर्डर में कुंजी है। एक बार हमारे पास चाबियाँ हो जाने के बाद, हम उन रिपोर्टों को बनाने के लिए जा सकते हैं जो ASCIIBetical ऑर्डर में कुंजी सूचीबद्ध करते हैं।

my @keys = sort { $a cmp $b } keys %hash; 

foreach my $key (@keys) { 
    printf "%-20s %6d\n", $key, $hash{$key}; 
} 

हालांकि हम इस प्रकार() ब्लॉक में अधिक फैंसी प्राप्त कर सकते हैं। चाबियों की तुलना करने के बजाय, हम उनके साथ एक मूल्य की गणना कर सकते हैं और तुलना के रूप में उस मान का उपयोग कर सकते हैं।

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

my @keys = sort { lc $a cmp lc $b } keys %hash; 

नोट: यदि गणना महंगा है या हैश कई तत्व है, आप कर सकते हैं गणना परिणामों को कैश करने के लिए श्वार्टज़ियन ट्रांसफॉर्म को देखना चाहते हैं।

यदि हम इसके बजाय हैश मान को सॉर्ट करना चाहते हैं, तो हम इसे देखने के लिए हैश कुंजी का उपयोग करते हैं। हम अभी भी चाबियों की एक सूची प्राप्त करते हैं, लेकिन इस बार उन्हें उनके मूल्य से आदेश दिया जाता है।

my @keys = sort { $hash{$a} <=> $hash{$b} } keys %hash; 

वहां से हम और अधिक जटिल हो सकते हैं। यदि हैश मान समान हैं, तो हम हैश कुंजी पर द्वितीयक प्रकार प्रदान कर सकते हैं।

my @keys = sort { 
$hash{$a} <=> $hash{$b} 
or 
"\L$a" cmp "\L$b" 
} keys %hash; 
+2

नाइट: 'एलसी ($ ए) सीएमपी एलसी ($ बी)', जिसे आपने '\ L $ a" cmp "\ L $ b" 'के रूप में भी लिखा है, हमेशा सही काम नहीं करेगा। आप 'एफसी ($ ए) सीएमपी एफसी ($ बी)' ('" \ एफ $ ए "सीएमपी" \ एफ $ बी "') चाहते हैं। 5.16 के बाद से उपलब्ध है। – ikegami

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