2014-04-12 9 views
9

के साथ पायथन में सॉर्टिंग काउंटर संग्रह Python 3.3.x में Counter है जो मैं सॉर्ट करना चाहता हूं।
मुझे पता है कि मैं .most_common(x) का उपयोग कर सकता हूं लेकिन मैं चाहता हूं कि समान मूल्य के मामले में चाबियाँ क्रमबद्ध रूप से क्रमबद्ध हों।
क्या ऐसा कोई तरीका है जो मैं कर सकता हूं? इस तरह के 'टाई ब्रेकर' को सेट करना?द्वितीयक अवधि (टाई ब्रेकर)

उत्तर

13

collections.Counter वास्तव में एक शब्दकोश है और वे हैशिंग तकनीक पर भरोसा करते हैं, इसलिए हम वास्तव में क्रम में उन्हें एक्सेस नहीं कर सकते हैं। चूंकि ऑर्डर द्वारा एक्सेस करना संभव नहीं है, इसलिए एक शब्दकोश को सॉर्ट करना प्रश्न से बाहर है। लेकिन आप इसे tuples की सूची में परिवर्तित कर सकते हैं जो कुंजी और मान के अनुरूप है, और फिर उसे सॉर्ट करें। उदाहरण के लिए,

print(Counter('abracadabra').most_common()) 
# [('a', 5), ('r', 2), ('b', 2), ('c', 1), ('d', 1)] 
print(sorted(Counter('abracadabra').most_common(), key=lambda x: (-x[1], x[0]))) 
# [('a', 5), ('b', 2), ('r', 2), ('c', 1), ('d', 1)] 

हम sorted तरह most_common द्वारा दिए गए (key, value) डेटा बनाते हैं। हम यह सुनिश्चित करना चाहते हैं कि वस्तुओं को उनके value द्वारा अवरुद्ध किया जाना चाहिए और key द्वारा आरोही में क्रमबद्ध किया जाना चाहिए। तो, हम यहां एक छोटी सी चाल का उपयोग करते हैं। अनुक्रम में प्रत्येक तत्व को सॉर्ट करने के लिए sorted उस फ़ंक्शन को कॉल करेगा जिसे हम key पैरामीटर के मान के रूप में पास करते हैं। उस फ़ंक्शन द्वारा लौटाए गए मान का उपयोग अन्य तत्वों की तुलना में उस विशेष तत्व का प्रतिनिधित्व करने के लिए किया जाएगा। हमारे मामले में, key समारोह इस

lambda x: (-x[1], x[0]) 

यहाँ की तरह, x सभी तत्वों अंततः मिल जाएगा जाता है और यह पहले और दूसरे तत्वों की स्थिति स्वैप और वास्तविक गणना भाग को नकारता। चूंकि, sorted, डिफ़ॉल्ट रूप से, आरोही क्रम में डेटा को टाइप करता है, हम सबसे छोटी संख्या के विपरीत और इसके विपरीत बनाते हैं। उदाहरण के लिए,

[2, 3, 1] 

आप आरोही क्रम में उन्हें सुलझाने के लिए चाहते हैं, sorted, शुरुआत में सबसे छोटा तत्व और दूसरे स्थान पर अगले छोटी से छोटी और इतने पर रखना होगा जब तक यह सबसे बड़ा तत्व तक पहुँचता है। हमारे मामले में, यह [1, 2, 3] बन जाता है। अवरोही क्रम में तत्वों को क्रमबद्ध करने के लिए, हम उनके नकारात्मक मान वास्तविक संख्याओं का प्रतिनिधित्व करते हैं।

sorted([2, 3, 1], key=lambda x: -x) 

अब, जब sorted की पसंद 2, यह प्रयोग की जाने वाली मूल्य प्राप्त करने के key फ़ंक्शन को कॉल और यह -2 और उसी तरह वापस आ जाएगी, 1-1 हो जाएगा, 3-3 हो जाएगा। यह तत्व को शुरुआत में सबसे छोटे से रखेगा। चूंकि हमें 312 के लिए -3 मिल गया है, 3 शुरुआत में होगा, 2 इसके आगे होगा और 1 इसके बाद होगा। तो परिणाम [3, 2, 1] बन जाता है।

हम तत्व में दो वस्तुओं के आधार पर क्रमबद्ध करने के लिए एक ही तकनीक लागू करते हैं। हम पहली बार गिनती मानों के आधार पर उतरते हैं और यदि वे कुंजी के आधार पर क्रमबद्ध होते हैं, तो आरोही।

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