Want to protect your cyber security and still get fast solutions? Ask a secure question today.Go Premium

x
?
Solved

How do I count sequences in Python with itertools groupby?

Posted on 2016-11-16
3
Medium Priority
?
326 Views
Last Modified: 2016-11-17
I'm trying to use the itertools groupby function here:
https://docs.python.org/2/library/itertools.html#itertools.groupby

but there are no examples of how to do this with count.  Doing the following:
import itertools as itr
In [204]: list(itr.groupby('1222311'))
Out[204]:
[('1', <itertools._grouper at 0x3cae048>),
 ('2', <itertools._grouper at 0x3cae630>),
 ('3', <itertools._grouper at 0x3caedd8>),
 ('1', <itertools._grouper at 0x3cae1d0>)]

Open in new window

yields some indecipherable second element of each tuple.  What I want to get back from that is:
In [204]: list(itr.groupby('1222311'))
Out[204]:
[('1', 1),
 ('2', 3),
 ('3', 1),
 ('1', 2)]

Open in new window

though the order of elements within the tuples is irrelevant.  
I tried adding a second argument to the groupby (e.g. key=itr.count), but they all give errors.  How do I accomplish this and how do I use the keyfunc parameter of groupby?
0
Comment
Question by:ugeb
  • 2
3 Comments
 
LVL 16

Accepted Solution

by:
Walter Ritzel earned 2000 total points
ID: 41891826
The undecipherable object grouper is a lazy iterator, so in order to get the count for each of those elements, you need to get their len.

import itertools as itr
for a, b  in itr.groupby('1222311'):
    print("(%s,%s)" % (a, sum(1 for i in b)))

Open in new window


you could also write like this:
import itertools as itr
for a, b  in itr.groupby('1222311'):
    print("(%s,%s)" % (a, len(list(b))))

Open in new window

0
 
LVL 11

Author Comment

by:ugeb
ID: 41892272
Thank you, that's helpful.  What exactly is the iter group iterating? We already have the token, and then you're iterating over something that gives you a count.  It looks like, after some testing, that it's just the elements of the group.  I guess that's more useful in different scenarios with a more complicated grouping function.

How do I use the keyfunc parameter?  What functions would work there?  I've tried many different things, and they all give errors.
0
 
LVL 11

Author Closing Comment

by:ugeb
ID: 41892380
Okay, thanks to your help I figured out how to do it as a single list.  This is what I wanted to do:

[ (i[0],len(list(i[1]))) for i in itr.groupby('1113334')]
0

Featured Post

Free Tool: IP Lookup

Get more info about an IP address or domain name, such as organization, abuse contacts and geolocation.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

A set of related code is known to be a Module, it helps us to organize our code logically which is much easier for us to understand and use it. Module is an object with arbitrarily named attributes which can be used in binding and referencing. …
The purpose of this article is to demonstrate how we can use conditional statements using Python.
Learn the basics of strings in Python: declaration, operations, indices, and slicing. Strings are declared with quotations; for example: s = "string": Strings are immutable.: Strings may be concatenated or multiplied using the addition and multiplic…
Learn the basics of if, else, and elif statements in Python 2.7. Use "if" statements to test a specified condition.: The structure of an if statement is as follows: (CODE) Use "else" statements to allow the execution of an alternative, if the …
Suggested Courses

564 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question