2013-04-15 17 views
14

मैं अजगर के लिए बिल्कुल नया हूं, लेकिन मैं कहीं भी मेरी समस्या का समाधान नहीं ढूंढ पाया।tuples की सूची में घटनाओं की मात्रा की गणना

मैं tuples की सूची के अंदर एक स्ट्रिंग की घटनाओं को गिनना चाहता हूं।

यहाँ tuples की सूची है:

list1 = [ 
     ('12392', 'some string', 'some other string'), 
     ('12392', 'some new string', 'some other string'), 
     ('7862', None, 'some other string') 
     ] 

मैं इस की कोशिश की है, लेकिन एक ही आईडी होता है के रूप में यह सिर्फ प्रिंट 0

for entry in list1: 
    print list1.count(entry[0]) 

दो बार सूची में, इस लौटना चाहिए:

2 
1 

मैंने एक ही आईडी की प्रत्येक घटना के लिए काउंटर बढ़ाने की भी कोशिश की लेकिन मुझे समझ में नहीं आया कि कैसे ते

* संपादित करें: यूमिरो के भयानक उत्तर का उपयोग करना। मुझे अभी एहसास हुआ कि मैंने पूरी समस्या की व्याख्या नहीं की है। मैं वास्तव में प्रविष्टियों जो एक मूल्य से अधिक 1. है की कुल राशि की जरूरत है लेकिन अगर मैं करने का प्रयास करें:

ValueError: Too many values to unpack 

उत्तर

24

शायद collections.Counter आपकी समस्या का समाधान हो सकता है::

for name, value in list1: 

    if value > 1: 
     print value 

मैं इस त्रुटि मिलती है

from collections import Counter 
Counter(elem[0] for elem in list1) 

रिटर्न

Counter({'12392': 2, '7862': 1}) 

यह तेज़ है क्योंकि यह आपकी सूची में केवल एक बार फिर से शुरू होता है। आप प्रविष्टियों पर फिर से प्रयास करते हैं और फिर अपनी सूची में इन प्रविष्टियों की गिनती प्राप्त करने का प्रयास करते हैं। यही कारण है कि .count के साथ नहीं किया जा सकता है लेकिन किया जा सकता है इस प्रकार है:

for entry in list1: 
    print sum(1 for elem in list1 if elem[0] == entry[0]) 

लेकिन गंभीरता से, collections.Counter पर एक नजर है।

संपादित: मैं वास्तव में जो एक मूल्य है प्रविष्टियों की कुल राशि की जरूरत है 1. एक से अधिक

तुम अब भी Counter उपयोग कर सकते हैं:

c = Counter(elem[0] for elem in list1) 
sum(v for k, v in c.iteritems() if v > 1) 

रिटर्न 2, योग यानी 1.

+0

'काउंटर' इसे इतना आसान बनाता है – jamylak

+0

धन्यवाद! यह वास्तव में सरल है! मुझे अभी एहसास हुआ कि मैंने पूरी समस्या की व्याख्या नहीं की है। मैंने मूल प्रश्न अपडेट किया। – mackwerk

+0

@Mackwerk - मेरा संपादित उत्तर देखें। – eumiro

4

list1.count(entry[0]) काम नहीं करेगा क्योंकि यह प्रत्येक थ्रू को देखता है ee tuples list1, उदाहरण के लिए। ('12392', 'some string', 'some other string') और जांचें कि क्या वे '12392' के बराबर हैं, उदाहरण के लिए, जो स्पष्ट रूप से मामला नहीं है।

@ यूरोमिरो का जवाब आपको दिखाता है कि Counter के साथ यह कैसे करें (जो सबसे अच्छा तरीका है!) लेकिन यहाँ वर्णन करने के लिए एक गरीब आदमी का संस्करण है कैसे Counter एक शब्दकोश और dict.get(k, [,d]) विधि है जो एक प्रमुख (k) प्राप्त करने का प्रयास करेंगे, लेकिन अगर यह मौजूद नहीं है यह बजाय डिफ़ॉल्ट मान देता है (d) का उपयोग कर काम करता है:

>>> list1 = [ 
     ('12392', 'some string', 'some other string'), 
     ('12392', 'some new string', 'some other string'), 
     ('7862', None, 'some other string') 
] 
>>> d = {} 
>>> for x, y, z in list1: 
     d[x] = d.get(x, 0) + 1 


>>> d 
{'12392': 2, '7862': 1} 
+0

कूल! यह देखना दिलचस्प है कि यह कैसे काम करता है :) – mackwerk

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