2016-12-03 10 views
8

एक बुनियादी काउंटर एक मानचित्रण से प्रारंभ पर विचार करें:अजगर - मानचित्रण से काउंटर() बनाएं, गैर पूर्णांक मूल्यों

dict_1 = {'a': 1, 'b': 2, 'c': 3} 
count_1 = Counter(dict_1) 
print count_1 

>>> Counter({'c': 3, 'b': 2, 'a': 1}) 

सब कुछ समझ में आता है। लेकिन काउंटर मुझे एक ऐसे शब्दकोश से प्रारंभ करने की इजाजत देता है जिसमें गैर-पूर्णांक दोनों कुंजी और मान के रूप में होते हैं। उदाहरण के लिए,

dict_2 = {'a': 'apple', 'b': 'banana', 'c': 'cheese'} 
count_2 = Counter(dict_2) 
print count_2 

>>> Counter({'c': 'cheese', 'b': 'banana', 'a': 'apple'}) 

कोड ऊपर लिखा अजगर 2.7 है, लेकिन मैं भी अजगर 3.5 पर यह परीक्षण किया है और एक ही परिणाम मिला है। ऐसा लगता है कि काउंटर के सबसे बुनियादी नियम का उल्लंघन होता है, जहां "तत्व कुंजीपटल कुंजी के रूप में संग्रहीत होते हैं और उनकी गणना शब्द मानों के रूप में संग्रहीत होती है।" क्या काउंटर उन मानों को अनुमति देने वाला है जो पूर्णांक नहीं हैं? क्या इसे किसी त्रुटि या कुछ नहीं फेंकना चाहिए? इस व्यवहार को क्या समझाता है?

उत्तर

8

एक काउंटर वस्तु के मूल्यों पर कोई प्रतिबंध नहीं कर रहे हैं और यह स्पष्ट रूप दस्तावेज में कहा गया है:

Counter वर्ग ही अपने कुंजी और मूल्यों पर कोई प्रतिबंध नहीं के साथ एक शब्दकोश उपवर्ग है। मान इरादे संख्या संख्याओं का प्रतिनिधित्व करने के लिए हैं, लेकिन आप मूल्य क्षेत्र में कुछ स्टोर कर सकते हैं।

[जोर मेरा]

Counter तरीकों में से कुछ का व्यवहार भी एक सामान्य मामले उदा .: में वर्णित

most_common() विधि केवल कि मूल्यों orderable हो की आवश्यकता है।

>>> count_2.most_common() 
[('c', 'cheese'), ('b', 'banana'), ('a', 'apple')] 
>>> count_2.most_common(2) 
[('c', 'cheese'), ('b', 'banana')] 

तो एक आसानी से अजगर 3 में समस्याएं आ सकता है अगर आप काउंटर वस्तु में मूल्यों के रूप में unorderable प्रकार है:

>>> count_2['d'] = 2 
>>> count_2 
Counter({'c': 'cheese', 'a': 'apple', 'b': 'banana', 'd': 2}) 
>>> count_2.most_common() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "c:\Python34\lib\collections\__init__.py", line 492, in most_common 
    return sorted(self.items(), key=_itemgetter(1), reverse=True) 
TypeError: unorderable types: str() < int() 

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

+0

धन्यवाद! यह बहुत उपयोगी था। – GHH

+0

@GHH यदि आप मदद करते हैं तो आप जवाब स्वीकार करने पर विचार कर सकते हैं –

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