2016-09-11 5 views
0

sah ich den folgenden Code, um eine Liste in zwei Klassen zu filtern:Wie funktioniert dies reduzieren + Lambda-Liste Filterfunktion arbeiten?

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

Wie funktioniert es? die ([], []) sieht die Initialisierung der (a, b) in Lambda, aber wie funktioniert es Schritt für Schritt?

Das scheint auch in Python 3 nicht zu funktionieren. Warum ist das?

Antwort

0

Um Ihre erste Abfrage zu beantworten, die äquivalente for-Schleife:

>>> 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]) 

Equivalent in python3 ist:

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

Wie funktioniert es? die ([], []) sieht die Initialisierung der (a, b) in Lambda, aber wie funktioniert es Schritt für Schritt?

An jedem Punkt sieht die Verringerung einen linken Operanden, (a, b), die ein Paar von Listen (zunächst zwei leere Listen), und ein Element c. Es fügt die Liste [c] entweder a oder b hinzu, je nachdem, ob es größer als 60 ist, und gibt das neue Listenpaar zurück. So wird es schließlich das Paar der Elemente größer als 60 bzw. weniger als 60 zurückgeben.

Das scheint auch nicht in Python 3 zu funktionieren. Warum ist das?

In Python3 können Sie keine Funktion mehr definieren, die explizit ein Tupel verwendet - tuple unpacking has been removed. So

ist illegal in Python3. Hier ist auch das Problem (außer in Form eines Lambda).

+0

Python3: 'reduzieren (Lambda a, c: (a [0] + [c], a [1]) wenn c> 60 sonst (a [0], a [1] + [c ]), [49, 58, 76, 82, 88, 90], ([], [])) ' –

+0

@arvindpdmn Vielen Dank! –

0

Werfen Sie einen Blick auf das folgende Experiment:

>>> 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]) 

Funktion reduce wie folgt beschrieben wird:

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. 

In unserem Beispiel ist Funktion eine Lambda-Funktion mit dem ersten Argument als 2-Element Tupel (a,b) und zweites Argument als eine ganze Zahl c aus der Liste für die Verarbeitung abgeholt. Da function ein 2-Element-Tupel von Listen erzeugt, wird es als ([], []) initialisiert. Wenn bei der Verarbeitung das Element> 60 ist, wird es zur ersten Liste des Tupels hinzugefügt; Andernfalls wird es der zweiten Liste des Tupels hinzugefügt.

Die Syntax a+[c] ist wirklich die extend Syntax einer Liste. Wir können nicht tun a+c seit a ist eine Liste und c ist eine ganze Zahl. Ebenso für b+[c]