ActiveState Code

Recipe 425044: Splitting up a sequence


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

Python
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)]

Discussion

As discussed on: http://gumuz.looze.net/wordpress/index.php/archives/2005/04/20/python-chopping-up-a-sequence/

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']

Comments

  1. 1. At 7:47 a.m. on 8 jun 2005, Nick Matsakis said:

    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]]
    
  2. 2. At 2:20 p.m. on 9 jun 2005, Guyon Morée (the author) said:

    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/

  3. 3. At 11:41 a.m. on 10 jun 2005, Nick Matsakis said:

    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.

  4. 4. At 2:15 p.m. on 21 jun 2005, Gene tani said:

Sign in to comment