2016-07-12 7 views
2

EDIT: Nach dem Lesen des vorgeschlagenen Links habe ich keine Ahnung, warum dies als ein Duplikat markiert wurde. Verklagen Sie mich.Python: Filter (keine, [Liste der Bools]) Verhalten

Kann jemand mir helfen zu verstehen, warum filter(None, [list of bools])False Werte entfernt?

Nehmen Sie folgendes:

low = 25 
high = 35 
to_match = [15, 30, 32, 99] 
def check(low, high, to_match): 
    return [low <= i <= high for i in to_match] 

check(low, high, to_match) kehrt [False, True, True, False]

filter(None, check(low, high, to_match)) kehrt [True, True]

Also dachte ich, muss Python denken False ist None! Aber zu meiner Überraschung gibt False is NoneFalse zurück!

A) Was fehlt mir?

B) Wie kann ich nur None Werte von [True, None, False] filtern?

+0

'None' ist falsy, aber die größere Frage, die ich dir stellen möchte: Was glaubst du * das' filter (None, [bools]) 'dir geben würde? – Makoto

+0

Warum erhalten Sie 'None' Werte? Oder fragt man sich, warum es so ist? – Tim

+0

@Makoto Ich nahm 'filter (Keine, [True, False, None])' würde zurückkehren '[True, False]' – AutomaticStatic

Antwort

7

Wenn Sie None auszufiltern verwenden:

filter(lambda x: x is not None, [list of bools]) 

oder

[x for x in [list of bools] if x is not None] 

filter takes a function, not a value. filter(None, ...) ist eine Abkürzung für filter(lambda x: x, ...) - es wird Wert herauszufiltern, die falsch-y (Hervorhebung von mir) sind:

filter(function, iterable)

eine Liste von diesen Elementen iterable Construct, für die function TRUE zurück. iterable kann entweder eine Sequenz, ein Container, der Iteration unterstützt, oder ein Iterator sein. Wenn iterable eine Zeichenfolge oder ein Tupel ist, hat das Ergebnis auch diesen Typ; Ansonsten ist es immer eine Liste. Wenn die Funktion None ist, wird die Identity-Funktion angenommen, dh alle Elemente von iterable, die falsch sind, werden entfernt.

anzumerken, dass filter(function, iterable) zu [item for item in iterable if function(item)] äquivalent ist, wenn die Funktion nicht None ist und wenn die Funktion [item for item in iterable if item]None ist.

+0

Sie sollten 'is not 'anstelle von'! = 'Though verwenden. – tynn

1

Für python3 können Sie None.__ne__ verwenden, um nur Keine zu entfernen, nur keine Filterung verwendet wird alle Falsey Werte wie [], {} 0 etc .. entfernen:

filter(None.__ne__, check(low, high, to_match)) 

für python2 müssen Sie einen Lambda hinzufügen jede Überprüfung is not None Element:

filter(lambda x: x is not None,....) 

Wenn Sie den Stick in eine Liste comp verwenden python2:

[ele for ele in check(low, high, match) if ele is not None] 

Jede Leistungssteigerung bei der Verwendung von Filtern wird durch die Lambda-Aufrufe ausgeglichen, so dass es tatsächlich langsamer wird.

Verwandte Themen