A way to re-organize a list

Carsten Haese carsten at uniqsys.com
Thu Jul 19 11:27:34 EDT 2007


On Thu, 2007-07-19 at 15:05 +0000, beginner wrote:
> Hi Everyone,
> 
> I have a simple list reconstruction problem, but I don't really know
> how to do it.
> 
> I have a list that looks like this:
> 
> l=[ ("A", "a", 1), ("A", "a", 2), ("A", "a", 3), ("A", "b", 1), ("A",
> "b", 2), ("B", "a", 1), ("B", "b", 1)]
> 
> What I want to do is to reorganize it in groups, first by the middle
> element of the tuple, and then by the first element. I'd like the
> output look like this:
> 
> out=[
>    [    #group by first element "A"
>           [("A", "a", 1), ("A", "a", 2), ("A", "a", 3)], #group by
> second element "a"
>           [ ("A", "b", 1), ("A", "b", 2)], #group by second element
> "b"
>    ],
>    [   #group by first element "B"
>           [("B", "a", 1)],
>           [("B", "b", 1)]
>    ]
> ]

That's easy with the magic of itertools.groupby and operator.itemgetter:

>>> from itertools import groupby
>>> from operator import itemgetter
>>> from pprint import pprint
>>> first = itemgetter(0)
>>> second = itemgetter(1)
>>> l = [ ("A", "a", 1), ("A", "a", 2), ("A", "a", 3), ("A", "b", 1), ("A",
... "b", 2), ("B", "a", 1), ("B", "b", 1)]
>>> result = [[list(g2) for _,g2 in groupby(g1,second)] for _,g1 in groupby(l,first)]
>>> pprint(result)
[[[('A', 'a', 1), ('A', 'a', 2), ('A', 'a', 3)],
  [('A', 'b', 1), ('A', 'b', 2)]],
 [[('B', 'a', 1)], [('B', 'b', 1)]]]

HTH,

-- 
Carsten Haese
http://informixdb.sourceforge.net





More information about the Python-list mailing list