Python リストを間引く

リストを間引く関数を考えた。例えば100個の要素のリストがあって、5つ飛ばしでリストを作ると20個の要素のリストになる。そういう感じで要素を飛ばすなり削除するなりして、リストを間引く。いまいち使いどころがわからないな。

def thinouted(lst, newsize):
    """間引いたリストを返す"""
    result = []
    cnt = 0
    for x in lst:
        cnt -= newsize
        if cnt < 0:
            cnt += len(lst)
            result.append(x)
    return result
    
    
lst = thinouted(range(100), 4)
print lst  # [0, 25, 50, 75]
def thinout(lst, newsize):
    """リストを間引く"""
    length = len(lst)
    cnt = length - 1
    for i in range(length-1, -1, -1):
        cnt -= newsize
        if cnt >= 0:
            del lst[i]
        else:
            cnt += length


lst = range(100)
thinout(lst, 6)
print lst  # [0, 16, 33, 50, 66, 83]


イテレータを返すのも考えた、延々と続くイテレータでも想定するサイズを指定してやれば間引くことができる。

def ithinout(iterable, newsize, itersize=None):
    """間引いたイテレータを返す"""
    if itersize == None:
        itersize = len(iterable)
    cnt = 0
    limit = itersize
    for x in iterable:
        cnt -= newsize
        if cnt < 0:
            cnt += itersize
            yield x
        limit -= 1
        if limit == 0: break


for i in ithinout(range(100), 20):
    print i,

import itertools
for i in ithinout(itertools.count(), 20, 100):
    print i,