tags:

views:

263

answers:

3

If I make a list in Python and want to write a function that would return only odd numbers from a range 1 to x how would I do that?

For example, if I have list [1, 2, 3, 4] from 1 to 4 (4 ix my x), I want to return [1, 3].

+11  A: 

If you want to start with an arbitrary list:

[item for item in yourlist if item % 2]

but if you're always starting with range, range(1, x, 2) is better!-)

For example:

$ python -mtimeit -s'x=99' 'filter(lambda(t): t % 2 == 1, range(1, x))'
10000 loops, best of 3: 38.5 usec per loop
$ python -mtimeit -s'x=99' 'range(1, x, 2)'
1000000 loops, best of 3: 1.38 usec per loop

so the right approach is about 28 times (!) faster than a somewhat-typical wrong one, in this case.

The "more general than you need if that's all you need" solution:

$ python -mtimeit -s'yourlist=range(1,99)' '[item for item in yourlist if item % 2]'
10000 loops, best of 3: 21.6 usec per loop

is only about twice as fast as the sample wrong one, but still over 15 times slower than the "just right" one!-)

Alex Martelli
Thank-you, works! You wouldn't happen to also be able to help me with even numbers too, would you? ><
John
`range(0, x, 2)` will work for evens (0 included; s/0/2/ if you want to exclude 0).
Alex Martelli
Ummm ... to get even numbers would be: range(0,x,2) or return [x for x in yourlist if not x % 2] ... Dude! You gotta at least TRY to understand what we're telling you!
Jim Dennis
A: 

What's wrong with:

def getodds(lst):
    return lst[1::2]

....???

(Assuming you want every other element from some arbitrary sequence ... all those which have odd indexes).

Alternatively if you want all items from a list of numbers where the value of that element is odd:

def oddonly(lst):
    return [x for x in lst if x % 2]
Jim Dennis
A: 

To have a range of odd/even numbers up to and possibly including a number n, you can:

def odd_numbers(n):
    return range(1, n+1, 2)
def even_numbers(n):
    return range(0, n+1, 2)

If you want a generic algorithm that will take the items with odd indexes from a sequence, you can do the following:

import itertools
def odd_indexes(sequence):
    return itertools.islice(sequence, 1, None, 2)
def even_indexes(sequence):
    return itertools.islice(sequence, 0, None, 2)
ΤΖΩΤΖΙΟΥ