2013-11-09 5 views
15

मान लीजिए मैं कुछ डेटा है कि निम्नलिखित की तरह लग रहा है।पायथन: Collections.Counter बनाम defaultdict (int)

Lucy = 1 
Bob = 5 
Jim = 40 
Susan = 6 
Lucy = 2 
Bob = 30 
Harold = 6 

मैं गठबंधन करना चाहता हूं 1) डुप्लिकेट कुंजी हटाएं, और 2) इन डुप्लिकेट कुंजी के लिए मान जोड़ें। इसका मतलब है कि मैं कुंजी/मान मिल चाहते हैं:

Lucy = 3 
Bob = 35 
Jim = 40 
Susan = 6 
Harold = 6 

यह (संग्रह से) का उपयोग करने के लिए एक काउंटर या इस के लिए एक डिफ़ॉल्ट dict बेहतर होगा?

+2

क्या दोनों काम करते हैं? फिर एक सिक्का फ्लिप करें। ऐसा कहा जाता है, ऐसा लगता है कि 'संग्रह। काउंटर 'दोहराने वाले तत्वों के साथ एक सूची के लिए है। – millimoose

+1

दोनों संस्करणों को कोड करें, और देखें कि आप किसके लिए अधिक पसंद करते हैं। – NPE

उत्तर

23

दोनों Counter और defaultdict(int) ठीक यहाँ काम कर सकते हैं, लेकिन उनके बीच में कुछ अंतर हैं:

  • Counter आपरेशन आप एक multiset पर कर सकते हैं का सबसे समर्थन करता है। इसलिए, यदि आप उन ऑपरेशन का उपयोग करना चाहते हैं तो काउंटर के लिए जाएं। जब आप कुंजी लापता के लिए क्वेरी

  • Counter dict के लिए नई चाबी नहीं जोड़ा जाएगा। तो, अगर आपके प्रश्नों चाबियाँ कि dict में मौजूद नहीं हो सकता है शामिल हैं तो बेहतर Counter का उपयोग करें।

उदाहरण:

>>> c = Counter() 
>>> d = defaultdict(int) 
>>> c[0], d[1] 
(0, 0) 
>>> c 
Counter() 
>>> d 
defaultdict(<type 'int'>, {1: 0}) 

उदाहरण:

  • Counter भी एक विधि most_common कहा जाता है कि आप उनकी गिनती द्वारा आइटम सॉर्ट करने के लिए अनुमति देता है। defaultdict में एक ही बात के लिए आप sorted का उपयोग करना होगा।

उदाहरण:

>>> c = Counter('aaaaaaaaabbbbbbbcc') 
>>> c.most_common() 
[('a', 9), ('b', 7), ('c', 2)] 
>>> c.most_common(2)   #return 2 most common items and their counts 
[('a', 9), ('b', 7)] 
  • Counter भी आप काउंटर वस्तु से तत्वों की सूची बनाने के लिए अनुमति देता है।

उदाहरण:

>>> c = Counter({'a':5, 'b':3}) 
>>> list(c.elements()) 
['a', 'a', 'a', 'a', 'a', 'b', 'b', 'b'] 

तो, क्या आप जिसके परिणामस्वरूप dict साथ क्या करना चाहते हैं पर निर्भर करता आप Counter और defaultdict(int) के बीच चयन कर सकते हैं।

+1

मैं भी जोड़ते हैं वह है कि एक काउंटर में निर्मित 'most_common साथ मूल्यों से छँटाई()' –

+0

@KevinStone कि रूप में अच्छी तरह जोड़ा गया। –

+0

मदद के लिए धन्यवाद! यहाँ --http एक और अच्छा सवाल मिला: //stackoverflow.com/questions/10654499/removing-duplicate-keys-from-python-dictionary-but-summing-the-values – covariance

0

मैं सूची संख्याओं की गणना के लिए defaultdict(int) का उपयोग करने के लिए इस मामले में, और Counter() का उपयोग करने का समर्थन करता हूं। आपके मामले में, निम्नलिखित सबसे साफ समाधान होगा:

name_count = [ 
    ("Lucy", 1), 
    ("Bob", 5), 
    ("Jim", 40), 
    ("Susan", 6), 
    ("Lucy", 2), 
    ("Bob", 30), 
    ("Harold", 6) 
] 

aggregate_counts = defaultdict(int) 
for name, count in name_count: 
    aggregate_counts[name] += count 
संबंधित मुद्दे