Velocity Reviews > Is there an easier way to break a list into sub groups

Is there an easier way to break a list into sub groups

MetalOne
Guest
Posts: n/a

 02-22-2004
The following does what I want, but I feel like this could maybe be a
one liner.
I just can't think of anything shorter.
If there is nothing shorter, does this seem like a candidate for
inclusion in the standard library somewhere.

>>> def groups(l, n):

"""l is an input list.
n is the size of the sub group
returns a list of the sub groups
"""
.... i=0
.... g = []
.... while i < len(l):
.... g.append(l[i:i+n]) #append sub group to g
.... i+=n
.... return g
....
>>> l = [1,2,3,4,5,6]
>>> groups(l,2)

[[1, 2], [3, 4], [5, 6]]
>>> groups(l,3)

[[1, 2, 3], [4, 5, 6]]
>>> groups(l,4)

[[1, 2, 3, 4], [5, 6]]

Shalabh Chaturvedi
Guest
Posts: n/a

 02-22-2004
MetalOne wrote:

> The following does what I want, but I feel like this could maybe be a
> one liner.
> I just can't think of anything shorter.
> If there is nothing shorter, does this seem like a candidate for
> inclusion in the standard library somewhere.
>
>>>> def groups(l, n):

> """l is an input list.
> n is the size of the sub group
> returns a list of the sub groups
> """
> ... i=0
> ... g = []
> ... while i < len(l):
> ... g.append(l[i:i+n]) #append sub group to g
> ... i+=n
> ... return g
> ...
>>>> l = [1,2,3,4,5,6]
>>>> groups(l,2)

> [[1, 2], [3, 4], [5, 6]]
>>>> groups(l,3)

> [[1, 2, 3], [4, 5, 6]]
>>>> groups(l,4)

> [[1, 2, 3, 4], [5, 6]]

It's generally considered more Pythonic to use the range() function instead
of incrementing counters while looping. Also, list comprehensions are a
useful tool. These combined give us one possible solution:

>>> l = range(10)
>>> n = 2
>>> [l[i:i+n] for i in range(0, len(l), n)]

[[0, 1], [2, 3], [4, 5], [6, 7], [8, 9]]
>>> n = 3
>>> [l[i:i+n] for i in range(0, len(l), n)]

[[0, 1, 2], [3, 4, 5], [6, 7, 8], [9]]
>>>

HTH,
Shalabh

Terry Reedy
Guest
Posts: n/a

 02-22-2004

"MetalOne" <(E-Mail Removed)> wrote in message
news:(E-Mail Removed) om...
> The following does what I want, but I feel like this could maybe be a
> one liner.
> I just can't think of anything shorter.
> If there is nothing shorter, does this seem like a candidate for
> inclusion in the standard library somewhere.
>
> >>> def groups(l, n):

> """l is an input list.
> n is the size of the sub group
> returns a list of the sub groups
> """
> ... i=0
> ... g = []
> ... while i < len(l):
> ... g.append(l[i:i+n]) #append sub group to g
> ... i+=n
> ... return g
> ...
> >>> l = [1,2,3,4,5,6]
> >>> groups(l,2)

> [[1, 2], [3, 4], [5, 6]]
> >>> groups(l,3)

> [[1, 2, 3], [4, 5, 6]]
> >>> groups(l,4)

> [[1, 2, 3, 4], [5, 6]]

I believe there was a thread on this very question perhaps 6 months ago.
Maybe you can find it on Google.

tjr

Elaine Jackson
Guest
Posts: n/a

 02-22-2004
groups = lambda L,n: [L[i*ni+1)*n] for i in range(len(L)) if L[i*ni+1)*n]]

HTH

"MetalOne" <(E-Mail Removed)> wrote in message
news:(E-Mail Removed) om...
| The following does what I want, but I feel like this could maybe be a
| one liner.
| I just can't think of anything shorter.
| If there is nothing shorter, does this seem like a candidate for
| inclusion in the standard library somewhere.
|
| >>> def groups(l, n):
| """l is an input list.
| n is the size of the sub group
| returns a list of the sub groups
| """
| ... i=0
| ... g = []
| ... while i < len(l):
| ... g.append(l[i:i+n]) #append sub group to g
| ... i+=n
| ... return g
| ...
| >>> l = [1,2,3,4,5,6]
| >>> groups(l,2)
| [[1, 2], [3, 4], [5, 6]]
| >>> groups(l,3)
| [[1, 2, 3], [4, 5, 6]]
| >>> groups(l,4)
| [[1, 2, 3, 4], [5, 6]]

MetalOne
Guest
Posts: n/a

 02-22-2004
Thanks, just what I was looking for.