2011-01-13 5 views
0

セットを受け取り、複数のサブセットを返す関数/イディオム(任意の言語で)を知っていますか?ファンクションスタイルでの複数のセットの理解

不可欠スタイルなどでこれを行うには簡単です:

a = b = [] 

for x in range(10): 
    if even(x): 
     a.append(x) 
    else: 
     b.append(x) 

またはわずかに良い:

[even(x) and a.append(x) or b.append(x) for x in range(10)] 

セットの理解は、単一の述語に基づいて単一のリストを返します(そしてそれ以来事実上のマップ)バイナリ述語または複数の述語に基づいて、入力を2つ以上のビンに分割するものがあるはずです。

私が思い付くことができますneatest構文は次のとおりです。

>> def partition(iterable, *functions): 
>> return [filter(f,iterable) for f in functions] 
>> partition(range(10), lambda x: bool(x%2), lambda x: x == 2) 
[[1, 3, 5, 7, 9], [2]] 

答えて

2

(a -> Bool) -> [a] -> ([a], [a]) on Hoogleを検索すると、Data.List.partitionが得られます。

関数は、述語をリストとし、述語を満たしていない要素のリストを返します。つまり、あなたがそのソースを見て、パイソンに変換する場合は

partition p xs == (filter p xs, filter (not . p) xs) 

、かなりうまく機能している

def partition(predicate, sequence): 
    def select((yes, no), value): 
     if predicate(value): 
      return (yes + [value], no) 
     else: 
      return (yes, no + [value]) 
    return reduce(select, sequence, ([], [])) 

。オリジナルとは違って、それは怠惰ではありませんが、それはPythonでやっていくのが少し面倒です。

+0

ああ、私はHoogleがタイプサインに基づいて検索を許可したのを忘れてしまった!私の好奇心は満足しています、ありがとう。 – schallis

0

RubyのEnumerableミックスインは、あなたが記述は何をpartition方法があります。

+0

これは私が探していたものにかなり近いです。私はそれを行うより良い方法は、複数の関数を渡すことができるかもしれないと思う。 – schallis

関連する問題