Cycling through iterables diagonally

Mark Lawrence breamoreboy at
Fri Feb 26 06:00:31 EST 2016

On 26/02/2016 09:59, Peter Otten wrote:
> Pablo Lucena wrote:
>> Say I have a group of 4 lists as follows:
>> l1 = ['a1', 'a2', 'a3', 'a4']
>> l2 = ['b1', 'b2', 'b3', 'b4']
>> l3 = ['c1', 'c2', 'c3', 'c4']
>> l4 = ['d1', 'd2', 'd3', 'd4']
>> I would like to cycle through these lists "diagonally" in groups of
>> len(list) (in this example, each list has 4 items).
>> Prior to this I was mucking around with index counting while looping, and
>> popping lists out of a deque, popping an item out of the list, and
>> appending the list back into the deque during each iteration.
>> Is there a better/cleaner way to do this? I was hoping for some cool
>> itertools logic =)
> I have a weak spot for the itertools myself, but I think in terms of clarity
> it is hard to beat the conventional
> def diagonals(a):
>      N = len(a)
>      for i in range(N):
>          for k in range(N):
>              yield a[k][(k+i)%N]
> print(list(diagonals([l1, l2, l3, l4])))
> Of course that's as uncool as it can get ;)

It might be uncool, but at least I can read it, unlike the earlier Jussi 
Piitulainen answer that made my head spin :)

My fellow Pythonistas, ask not what our language can do for you, ask
what you can do for our language.

Mark Lawrence

More information about the Python-list mailing list