## With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, tutorials, and more.

No credit card required

# 19.6. Dividing an Iterable into n Slices of Stride n

Credit: Gyro Funch, Alex Martelli

## Problem

You have an iterable `p` and need to get the `n` non-overlapping extended slices of stride `n`, which, if the iterable was a sequence supporting extended slicing, would be `p` `[` `0` `:`:`n` `]`, `p` `[1:`:`n` `]`, and so on up to `p` `[` `n` `-1:`:`n` `]`.

## Solution

While extended slicing would return sequences of the same type we start with, it's much more sensible to specify a `strider` function that, instead, solves this problem by returning a list of lists:

```def strider(p, n):
""" Split an iterable p into a list of n sublists, repeatedly taking
the next element of p and adding it to the next sublist.  Example:
>>> strider('abcde', 3)
[['a', 'd'], ['b', 'e'], ['c']]
In other words, strider's result is equal to:
[list(p[i::n]) for i in xrange(n)]
if iterable p is a sequence supporting extended-slicing syntax.
"""
# First, prepare the result, a list of n separate lists
result = [ [  ] for x in xrange(n) ]
# Loop over the input, appending each item to one of
# result's lists, in "round robin" fashion
for i, item in enumerate(p):
result[i % n].append(item)
return result```

## Discussion

The function in this recipe takes an iterable `p` and pulls it apart into a user-defined number `n` of pieces (specifically, function `strider` returns a list of sublists), distributing `p`'s items into what would be the `n` extended slices of stride `n` if `p` were a sequence.

If we were willing to sacrifice generality, forcing argument `p` to be a sequence supporting extended ...

## With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, interactive tutorials, and more.

No credit card required