述語をもとにリストを2つに分ける関数を書いてみた

30分プログラム、その767。述語をもとにリストを2つに分ける関数を書いてみた。

例えば、整数のリストxsにたいして

partition(lambda x : x % 2 == 0, xs)

とやってやると、偶数のリストと奇数のリストに分割してくれる。

使い方

print partition(lambda x : x % 2 == 0, range(0,10))
# => ([0, 2, 4, 6, 8], [1, 3, 5, 7, 9])

ソースコード

#! /usr/bin/python
# -*- mode:python; coding:utf-8 -*-

def partition1(p, xs):
    return (filter(p,xs), filter(lambda x: not p(x),xs))

def partition2(p, xs):
    ys = []
    zs = []
    for x in xs:
        if p(x):
            ys.append(x)
        else:
            zs.append(x)
    return (ys,zs)

def partition(p, xs):
    def f(accum, x):
        if p(x):
            return (accum[0] + [x], accum[1])
        else:
            return (accum[0], accum[1] + [x])
    return reduce(f,xs,([],[]))

print partition(lambda x : x % 2 == 0, range(0,10))