Pythonic way to return list of every nth item in a larger list
source_list[::10]
is the most obvious, but this doesn't work for any iterable and is not memory efficient for large lists.itertools.islice(source_sequence, 0, None, 10)
works for any iterable and is memory-efficient, but probably is not the fastest solution for large list and big step.(source_list[i] for i in xrange(0, len(source_list), 10))
>>> lst = list(range(165))
>>> lst[0::10]
[0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160]
Note that this is around 100 times faster than looping and checking a modulus for each element:
$ python -m timeit -s "lst = list(range(1000))" "lst1 = [x for x in lst if x % 10 == 0]"
1000 loops, best of 3: 525 usec per loop
$ python -m timeit -s "lst = list(range(1000))" "lst1 = lst[0::10]"
100000 loops, best of 3: 4.02 usec per loop