2013-09-22 21 views
5

मेरे पास शब्दकोशों की एक सूची है (संक्षेप में)।मैं किसी सूची की सूची में किसी आइटम की घटनाओं को कैसे गिन सकता हूं?

my_list = [{ 'id':1, 'val':123 }, {'id':2, 'val':456 }, {'id':2, 'val':789 }] 

मैं कैसे (इस मामले 'id' में) एक विशेष कुंजी के लिए शब्दकोशों की घटनाओं को एक निर्धारित मूल्य के साथ भरोसा कर सकते हैं? वहाँ लाभ उठाने के लिए गिनती के लिए एक रास्ता (my_list.count('id' = 1)?!?)

उत्तर

7

है कैसे के बारे में

sum(1 for d in my_list if d.get('id') == the_value_you_are_interested_in) 

>>> my_list = [{ 'id':1, 'val':123 }, {'id':2, 'val':456 }, {'id':2, 'val':789 }] 
>>> sum(1 for d in my_list if d.get('id') == 1) 
1 
>>> sum(1 for d in my_list if d.get('id') == 2) 
2 
>>> sum(1 for d in my_list if d.get('id') == 20) 
0 

नोट जनरेटर बजाय +1 का सूची का उपयोग। यह एक सुंदर स्थापित तकनीक है और शायद कई स्टैक ओवरफ्लो प्रश्नों पर दिखाई देती है।

मुझे list.count(x) का लाभ उठाने का कोई तरीका नहीं दिख रहा है क्योंकि यह विधि x की घटनाओं की संख्या की गणना करती है, जो आपके मामले में पूर्ण शब्दकोश होंगे। पायथन में filter विधि है, लेकिन समझ बहुत पसंद है।

+0

मैं जवाब में अंतिम पंक्ति में अपना संदेश समझ में नहीं आता - अजगर शिक्षार्थी। –

+2

यदि मैं 'sum ([x में x के लिए] 1] लिखता हूं और' ए' एक बड़ी सूची है, तो सूची समझ सैद्धांतिक रूप से 1s की एक विशाल सूची उत्पन्न करती है, फिर उन्हें सब कुछ बताती है। लेकिन अगर मैं 'योग (एक्स में एक्स के लिए 1) लिखता हूं, तो 1 एस को' ए 'के रूप में समझाया जाता है, बिना बड़े ढांचे के महसूस किए जाते हैं। –

+0

अब मिल गया! मेरे लिए बहुत उपयोगी जानकारी। बहुत बहुत धन्यवाद। –

6

मुझे @ रे का जवाब पसंद है। collections.Counter का उपयोग करने के लिए एक और अच्छी चाल है।

from collections import Counter 

c = Counter(item for dct in my_list for item in dct.items()) 
c 
=> Counter({('id', 2): 2, ('val', 123): 1, ('id', 1): 1, ('val', 456): 1, ('val', 789): 1}) 

c[('id', 2)] 
=> 2 
c[('id', 1)] 
=> 1 
c[('id', 20)] 
=> 0 

यह समाधान विशेष रूप से अच्छा है यदि आपको एकाधिक कुंजी/मानों की गणना करने की आवश्यकता है।

आप केवल किसी विशेष कुंजी के बारे में परवाह है, तो आप कर सकते हैं:

k = 'id' 
id_counter = Counter(dct.get(k) for dct in my_list) 
id_counter 
=> Counter({2: 2, 1: 1}) 
id_counter[2] 
=> 2 
संबंधित मुद्दे