# Need a strange sort method...

Mon Oct 16 23:21:06 CEST 2006

```Tim Chase wrote:
> > for example:
> > a = [1,2,3,4,5,6,7,8,9,10] #Although not necessarily in order
> >
> > def cmp(i,j):  #to be defined in this thread.
>
> Well, if you're willing to give up doing it in a cmp() method,
> you can do it as such:
>
>  >>> a.sort()
>  >>> chunk_size = 3
>  >>> [a[i::chunk_size] for i in range(chunk_size)]
> [[1, 4, 7, 10], [2, 5, 8], [3, 6, 9]]
>
> If you need it in a flat list, rather than as a list of
> chunk_size lists (which are handy for iterating over in many
> cases), there are ways of obtaining it, such as the hackish
>
>  >>> sum([a[i::chunk_size] for i in range(chunk_size)], [])
> [1, 4, 7, 10, 2, 5, 8, 3, 6, 9]
>
> There are likely good recipes for flattening a list.  I just
> happen not to have any at my fingertips.
>
> I'm not sure it's possible to do in a cmp() method, given that it
> requires apriori knowledge of the dataset (are the numbers
> contiguous?).  Unless, of course, you have such a list...
>
> However, as a benefit, this method should work no matter what the
> list contains, as long as they're comparable to each other for an
> initial sorting:
>
>  >>> a = [chr(ord('a') + i) for i in range(10)]
>  >>> # a.sort() if it were needed
>  >>> a
> ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']
>  >>> sum([a[i::chunk_size] for i in range(chunk_size)], [])
> ['a', 'd', 'g', 'j', 'b', 'e', 'h', 'c', 'f', 'i']
>
>
> -tkc

Yes this is excellent...
Doh... How easy was that! :)
[a[i::chunk_size] for i in range(chunk_size)]

```