2016-09-11 9 views
0

私は2つのクラスにリストをフィルタリングするには、次のコードを見た:これはどのようにして+ラムダリストフィルタ関数を減らしますか?

reduce(lambda(a,b),c: (a+[c],b) if c > 60 else (a,b + [c]), [49, 58, 76, 82, 88, 90],([],[])) 

それがどのように動作しますか? ([], [])はラムダの(a, b)を初期化するように見えますが、それはどのように段階的に機能しますか?

これもPython 3では動作していないようです。それはなぜですか? forループを使用して同等の、あなたの最初のクエリに答えるために

答えて

0

:のpython3で等価

>>> c = [49, 58, 76, 82, 88, 90] 
>>> final = ([], []) 
>>> for val in c: 
...  if val > 60: 
...    final[0].append(val) 
...  else: 
...    final[1].append(val) 
... 
>>> final 
([76, 82, 88, 90], [49, 58]) 

は次のとおりです。

In [8]: import functools 

In [9]: functools.reduce(lambda x,c: (x[0]+[c],x[1]) if c > 60 else (x[0],x[1] + [c]), [49, 58, 76, 82, 88, 90],([],[])) 
Out[9]: ([76, 82, 88, 90], [49, 58]) 
1

それがどのように動作しますか? ([], [])はラムダの(a, b)を初期化するように見えますが、それはどのように段階的に機能しますか?各時点で

、低減は、リストのペア(最初に2つの空のリスト)である左手オペランド、(a, b)、および要素cを見ます。リスト[c]aまたはbのいずれかに追加します(60より大きいかどうかによって異なります)。リストの新しいペアが返されます。したがって、最終的には、60より大きく、60より小さい要素のペアをそれぞれ返します。

これもPython 3では動作していないようです。なぜですか?

Python3では、もはや明示的にタプルを取る関数を定義することはできません - tuple unpacking has been removed。したがって

def foo((a, b)): 
    ... 

はPython3では無効です。これはここでも問題です(ラムダの形を除いて)。

+0

の場合c> 60の場合は(a [0]、a [1] + [c](a [0] + [c]、a [1] ])、[49,58,76,82,88,90]、([]、[])) –

+0

@arvindpdmn多くの感謝! –

0

次のような実験を見てみましょう:

>>> reduce(lambda(a,b),c: (a+[c],b) if c > 60 else (a,b + [c]), [49],([],[])) 
([], [49]) 
>>> reduce(lambda(a,b),c: (a+[c],b) if c > 60 else (a,b + [c]), [49,58],([],[])) 
([], [49, 58]) 
>>> reduce(lambda(a,b),c: (a+[c],b) if c > 60 else (a,b + [c]), [49,58,76],([],[])) 
([76], [49, 58]) 
>>> reduce(lambda(a,b),c: (a+[c],b) if c > 60 else (a,b + [c]), [49,58,76,82],([],[])) 
([76, 82], [49, 58]) 
>>> reduce(lambda(a,b),c: (a+[c],b) if c > 60 else (a,b + [c]), [49,58,76,82,88,90],([],[])) 
([76, 82, 88, 90], [49, 58]) 

機能reduceを次のように説明されています。私たちの例では

reduce(...) 
    reduce(function, sequence[, initial]) -> value 

    Apply a function of two arguments cumulatively to the items of a sequence, 
    from left to right, so as to reduce the sequence to a single value. 

、関数は2要素として最初の引数とラムダ関数でありますタプル(a,b)と第2引数を整数としてcが処理のためにリストから取り上げられました。関数はリストの2要素タプルを生成するので、([], [])として初期化されます。処理が開始されると、要素が> 60の場合、それはタプルの最初のリストに追加されます。それ以外の場合は、タプルの2番目のリストに追加されます。

構文a+[c]は実際にはリストの構文extendです。 aがリストで、cが整数なので、a+cは実行できません。同様に、b+[c]の場合

関連する問題