I was doing a bit of Python at work and need to filter an array, all the values at the odd indexes into one array, all the one at the even indices into the other array. What I came up with is this:

class everyother:
"""Helper class for picking out
every other item when filtering
an array."""
def __init__(self, start):
self.start = start

def next(self, a):
self.start = not self.start
return self.start



Now I can use this to filter arrays.

>>> v = map(hex, range(20))
>>> v
['0x0', '0x1', '0x2', ..., '0x13']
>>> evens = filter(everyother(0).next, v)
>>> evens
['0x1', '0x3', '0x5', '0x7', '0x9', '0xb', '0xd', '0xf', '0x11', '0x13']


Cool, but I can't help wonder if there's a better way to do this in Python.

Updated: I forgot about list comprehensions. Sam offered this one-liner:

>>> odds = [v[i] for i in range(1, len(v), 2)]
>>> evens = [v[i] for i in range(0, len(v), 2)]


Woot!

[v[i] for i in range(1,len(v),2)]

Posted by Sam Ruby on 2003-06-18

Not necessarily “better“, but definitely “different”

from future import generators
def odds(list):
for i in range(1, len(v), 2):
yield i

m = odds(v)
for i in m:
print i

Posted by Gordon Weakliem on 2003-06-18

Not necessarily “better“, but definitely “different”

from future import generators
def odds(list):
for i in range(1, len(v), 2):
yield i

m = odds(v)
for i in m:
print i

Posted by Gordon Weakliem on 2003-06-18

In Python 2.3 (currently beta):
>>> evens = v[::2]
>>> odds = v[1::2]

Search for “extended slices” for more info.

Posted by Arien on 2003-06-19

Sweeet!

Found the docs:

http://www.python.org/dev/doc/devel/whatsnew/section-slices.html

You can even to v[::-1] to reverse the list.

Posted by Joe on 2003-06-19