jeffmangum
jeffmangum

Reputation: 103

Counting occurrences in a loop

gzip_files=["complete-credit-ctrl-txn-SE06_2013-07-17-00.log.gz","complete-credit-ctrl-txn-SE06_2013-07-17-01.log.gz"]

def input_func():
    num = input("Enter the number of MIN series digits: ")
    return num

for i in gzip_files:
    import gzip
    f=gzip.open(i,'rb')
    file_content=f.read()
    digit = input_func()
    file_content = file_content.split('[')
    series = [] #list of MIN
    for line in  file_content:
        MIN = line.split('|')[13:15]
        for x in MIN:
            n = digit
            x = x[:n]
            series.append(x)
            break


    #count the number of occurences in the list named series
    for i in series:
        print i
    #end count

Result:

63928
63928
63929
63929
63928
63928

That is only a part of the result. the actual result shows a really long list. Now i want to just list unique numbers and specify how many times it showed on the list. So

63928 = 4, 
63929 = 2

Upvotes: 0

Views: 4363

Answers (3)

Sukrit Kalra
Sukrit Kalra

Reputation: 34531

I would use a collections.Counter class here.

>>> a = [1, 1, 1, 2, 3, 4, 4, 5]
>>> from collections import Counter
>>> Counter(a)
Counter({1: 3, 4: 2, 2: 1, 3: 1, 5: 1})

Just pass your series variable to Counter and you'll get a dictionary where the keys are the unique elements and the values are their occurences in the list.

collections.Counter was introduced in Python 2.7. Use the following list comprehension for versions below 2.7

>>> [(elem, a.count(elem)) for elem in set(a)]
[(1, 3), (2, 1), (3, 1), (4, 2), (5, 1)]

You can then just convert this into a dictionary for easy access.

>>> dict((elem, a.count(elem)) for elem in set(a))
{1: 3, 2: 1, 3: 1, 4: 2, 5: 1}

Upvotes: 4

pygeek
pygeek

Reputation: 7414

Compile a dictionary using unique numbers as keys, and their total occurrences as values:

d = {} #instantiate dictionary

for s in series:
    # set default key and value if key does not exist in dictionary
    d.setdefault(s, 0)
    # increment by 1 for every occurrence of s
    d[s] += 1 

If this problem were any more complex. Implementation of map reduce (aka map fold) may be appropriate.

Map Reduce: https://en.wikipedia.org/wiki/MapReduce

Python map function: http://docs.python.org/2/library/functions.html#map

Python reduce function: http://docs.python.org/2/library/functions.html#reduce

Upvotes: 0

user764357
user764357

Reputation:

You can use a Counter() for this.

So this will print what you need:

from collections import Counter
c = Counter(series)
for item,count in c.items():
    print "%s = %s" % (item,count)

Upvotes: 1

Related Questions