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,