5

I have a list of numbers, how can I group every n numbers into a tuple?

For example, if I have a list a = range(10) and I want to group every 5 items into a tuple, so:

b = [(0,1,2,3,4),(5,6,7,8,9)]

How can I do this? I also want to raise an error if len(a) is not an integer multiple of n.

BenMorel
  • 34,448
  • 50
  • 182
  • 322
LWZ
  • 11,670
  • 22
  • 61
  • 79

3 Answers3

12
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> [tuple(a[i:i+5]) for i in range(0, len(a), 5)]
[(0, 1, 2, 3, 4), (5, 6, 7, 8, 9)]
linbo
  • 2,393
  • 3
  • 22
  • 45
1
In [18]: def f(lst,n):    
    ...:     if len(lst)%n != 0:
    ...:         raise ValueError("{} is not a multiple of {}".format(len(lst),n))
    ...:     return zip(*[iter(lst)]*n)

In [19]: lst = range(10)

In [20]: f(lst,5)
Out[20]: [(0, 1, 2, 3, 4), (5, 6, 7, 8, 9)]

In [21]: f(range(9),5)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-21-814a68e0035f> in <module>()
----> 1 f(range(9),5)

<ipython-input-18-3ca911a04fd3> in f(lst, n)
      1 def f(lst,n):
      2     if len(lst)%n != 0:
----> 3         raise ValueError("{} is not a multiple of {}".format(len(lst),n))
      4     return zip(*[iter(lst)]*n)

ValueError: 9 is not a multiple of 5
root
  • 76,608
  • 25
  • 108
  • 120
  • This looks great! Thanks! Although I'm not sure how did `zip(*[iter(lst)]*n)` work... – LWZ Mar 07 '13 at 09:04
  • @LWZ -- if you read through the questions, linked in the comments, you will find different implementations of the actual splitting with corresponding discussion... – root Mar 07 '13 at 09:07
1

determine that N is your group length

if (len(your_list)%n==0):
    wish_list = [ tuple(your_list[i:i+N]) for i in range(0, len(your_list), N) ]
else:
    raise Exception("not divisible by N")