Welcome, guest | Sign In | My Account | Store | Cart
2

Split up a sequence in same-size(if possible) parts.

Python, 6 lines
 ```1 2 3 4 5 6``` ```# Guyon Morée # http://gumuz.looze.net/ def split_seq(seq,size): """ Split up seq in pieces of size """ return [seq[i:i+size] for i in range(0, len(seq), size)] ```

It's very straight forward:

``````>>> lst = [1,2,3,4,5,6,7,8,9,10]
>>> split_seq(lst,2)
[[1, 2], [3, 4], [5, 6], [7, 8], [9,10]]
``````

It takes a list, re-groups them in another list, 2 items per group. The source list doesn't have to be evenly dividable though:

``````>>> lst = [1,2,3,4,5,6,7,8,9,10]
>>> split_seq(lst,3)
[[1, 2, 3], [4, 5, 6], [7, 8, 9], [10]]
``````

Of course, a string is a sequence too. That's what I used it for last time. I had a string of bits, which I needed to divide in pieces of 8, bytes:

``````>>> bits = '101011101001011010010110'
>>> split_seq(bits,8)
['10101110', '10010110', '10010110']
``````

Nick Matsakis 7 years, 11 months ago

One issue with this recipe is that you wind up with a list at the end that could be much shorter than what you have. Consider this alternative:

``````def split_seq(seq, size):
newseq = []
splitsize = 1.0/size*len(seq)
for i in range(size):
newseq.append(seq[int(round(i*splitsize)):int(round((i+1)*splitsize))])
return newseq
``````

This produces the following results, which may be preferred for some applications:

``````>>> split_seq([1,2,3,4,5,6,7,8,9,10], 3)
[[1, 2, 3], [4, 5, 6, 7], [8, 9, 10]]
``````
Guyon Morée (author) 7 years, 11 months ago

very useful as well. Thanx Nick, that's a cool one as well. Do you want me to add your version to the recipe or are you going to add this as a recipe as well?

Cheers, Guyon Morée http://gumuz.looze.net/

Nick Matsakis 7 years, 11 months ago

I just submitted it as a separate recipe, though I'm not sure I like it so much. I wonder if it could be done using only integer math.

Gene tani 7 years, 11 months ago