2012-02-16 16 views
11

मैं अपने दूसरे तत्वों द्वारा tuples की एक सूची सॉर्ट करना चाहता हूं।अपने दूसरे तत्वों द्वारा tuples की एक सूची क्रमबद्ध करें

उदाहरण इनपुट:

[("Bob",3),("Terry",1)] 

उदाहरण आउटपुट:

[("Terry",1)("Bob",3)] 
+2

क्या यह एक होमवर्क प्रश्न है? यदि ऐसा है, तो आपको 'होमवर्क' टैग जोड़ना चाहिए। –

उत्तर

13

आप उपयोग कर सकते हैं sortBy और comparing:

sortBy :: (a -> a -> Ordering) -> [a] -> [a] 
comparing :: (Ord b) => (a -> b) -> a -> a -> Ordering 

इस मामले में, हम दूसरा तत्व द्वारा की तुलना करना चाहते । आप comparing snd का उपयोग ऐसे फ़ंक्शन को प्राप्त करने के लिए कर सकते हैं जो दो टुपल्स को उनके दूसरे तत्व से तुलना कर सकता है।

import Data.Function (on) 
import Data.List (sortBy) 

sortBy (compare `on` snd) [...] 

नहीं comparing की तुलना में बहुत अलग है, लेकिन समय-समय पर एक अच्छा चाल:

+0

अगर मैं कहीं से भी कॉल करने के लिए अपना खुद का सॉर्टिंग फ़ंक्शन परिभाषित करना चाहता था तो मैं यह कैसे कर सकता हूं? मुझे इसे – user1214840

+0

से अधिक बार उपयोग करने की आवश्यकता हो सकती है। दूसरे शब्दों में, मैं अपने स्वयं के सॉर्टिंग फ़ंक्शन को परिभाषित करना चाहता था जो ट्यूपल्स की एक बिट्स को अपने दूसरे तत्व के आधार पर लेता है और फिर टुपल्स की वही क्रमबद्ध सूची देता है। – user1214840

+2

@ user1214840 किसी भी अन्य परिभाषा के समान: 'myFancySort = {- यहां ehird के संकेतों का उपयोग करके कार्यान्वयन -} ' –

15

एक और शांत चाल Data.Function से on उपयोग करने के लिए है।

+4

' पर 'कुछ अच्छी चाल है। मैं कभी-कभी उपयोगी होने के लिए 'equating = on (==)' ढूंढता हूं। (तुलना की तुलना में तुलना = –

2

पर विचार करें एक "नियमित" प्रकार

sort xs = ... a < b ... 

इस तरह के प्रकार compare का इस्तेमाल करते हैं चाहिए, या इस तरह के < के रूप में अपनी मित्र। तो अगर आपने पहले से ही ऐसी चीज लागू की है, तो बस compare a b या a < b की बजाय, आप इसके बजाय compare (snd a) (snd b) या snd a < snd b कर सकते हैं।

sort xs = ... snd a < snd b ... 

बेशक आप स्मार्ट मिलता है, तो आप करेंगे बाहर "एक्सेसर", और यह छँटाई समारोह के लिए एक अतिरिक्त इनपुट बनाने के सार:

sortComparingOn f xs = ... f a < f b ... 

तुम भी बाहर सार तुलनित्र हो सकता है पूरी तरह : ehird के रूप में उल्लेख

sortBy cmp xs = ... a `cmp` b ... 

sortBy, Data.List में प्रदान की जाती है।

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