Pairs from single list
I'd say that your initial solution pairs = zip(t[::2], t[1::2])
is the best one because it is easiest to read (and in Python 3, zip
automatically returns an iterator instead of a list).
To ensure that all elements are included, you could simply extend the list by None
.
Then, if the list has an odd number of elements, the last pair will be (item, None)
.
>>> t = [1,2,3,4,5]
>>> t.append(None)
>>> zip(t[::2], t[1::2])
[(1, 2), (3, 4), (5, None)]
>>> t = [1,2,3,4,5,6]
>>> t.append(None)
>>> zip(t[::2], t[1::2])
[(1, 2), (3, 4), (5, 6)]
My favorite way to do it:
def pairwise(t):
it = iter(t)
return zip(it,it)
# for "pairs" of any length
def chunkwise(t, size=2):
it = iter(t)
return zip(*[it]*size)
When you want to pair all elements you obviously might need a fillvalue:
from itertools import izip_longest
def blockwise(t, size=2, fillvalue=None):
it = iter(t)
return izip_longest(*[it]*size, fillvalue=fillvalue)
With Python 3, itertools.izip
is now simply zip
.. to work with an older Python, use
from itertools import izip as zip
I start with small disclaimer - don't use the code below. It's not Pythonic at all, I wrote just for fun. It's similar to @THC4k pairwise
function but it uses iter
and lambda
closures. It doesn't use itertools
module and doesn't support fillvalue
. I put it here because someone might find it interesting:
pairwise = lambda t: iter((lambda f: lambda: (f(), f()))(iter(t).next), None)