Ich habe Probleme, einen saubereren Weg zu finden, um einen booleschen Wert zurückzugeben, wenn mein Satz am Ende meiner Funktion leer ist
Ich nehme den Schnittpunkt zweier Mengen und möchte zurückkehren True
oder darauf False
basieren, ob die resultierende Menge leer ist.
def myfunc(a,b):
c = a.intersection(b)
#...return boolean here
Mein erster Gedanke war zu tun
return c is not None
In meinem Interpreter kann ich jedoch leicht erkennen, dass diese Aussage true zurückgibt, wenn c = set([])
>>> c = set([])
>>> c is not None
True
Ich habe auch Folgendes versucht:
>>> c == None
False
>>> c == False
False
>>> c is None
False
Jetzt habe ich aus der Dokumentation gelesen, die ich nur verwenden and
kann or
, und not
mit leeren Mengen, um einen booleschen Wert abzuleiten. Bisher kann ich mir nur vorstellen, nicht zurückzukehren, nicht c
>>> not not c
False
>>> not c
True
Ich habe das Gefühl, dass es einen viel pythonischeren Weg gibt, dies zu tun, indem ich mich bemühe, ihn zu finden. Ich möchte die tatsächliche Menge nicht an eine if-Anweisung zurückgeben, da ich die Werte nicht benötige. Ich möchte nur wissen, ob sie sich überschneiden.
bool(set([]))
isdisjoint
. Ich bin völlig geschockt.Antworten:
bool()
wird etwas ähnliches tunnot not
, aber ideomatischer und klarer.quelle
bool(...)
wenn Sie fragen,is_empty
ist dunkel. Ich drücke die Absicht nicht aus.not not
;). (FTR: Ich hatte bereits @gefeis Antwort positiv bewertet, aber ich habe keinen Einfluss auf die Sache, die OP akzeptiert hat ...)nicht so pythonisch wie die anderen Antworten, aber Mathematik:
Wie einige Kommentare fragten,
len(set)
könnte dies Auswirkungen auf die Komplexität haben. Es ist O (1), wie im Quellcode gezeigt, da es auf einer Variablen basiert , die die Verwendung des Satzes verfolgt.quelle
len(c)
auch wennc
es sehr groß ist, was nicht erforderlich ist, um die Leere zu überprüfen.set()
(Python 3.5.2 in Windows)Wenn Sie
return True
für ein leeres Set möchten , dann denke ich, wäre es klarer zu tun:dh "
c
ist gleich einem leerenset
".(Oder umgekehrt
return c != set()
).Meiner Meinung nach ist dies expliziter (wenn auch weniger idiomatisch), als sich auf Pythons Interpretation einer leeren Menge wie
False
in einem booleschen Kontext zu verlassen.quelle
Wenn
c
es sich um einen Satz handelt, können Sie überprüfen, ob er leer ist, indem Sie Folgendes tun :return not c
.Wenn
c
leer ist,not c
wird es seinTrue
.Andernfalls wird, wenn
c
Elemente enthaltennot c
seinFalse
.quelle
Wenn du sagst:
Sie prüfen tatsächlich, ob c und None auf dasselbe Objekt verweisen. Das macht der Operator "ist". In Python ist None ein spezieller Nullwert, was herkömmlicherweise bedeutet, dass kein Wert verfügbar ist. Sorta wie null in c oder java. Da Python intern nur einen None-Wert zuweist, wird mit dem Operator "is" überprüft, ob etwas None ist (think null), und es ist zum beliebten Stil geworden. Dies hat jedoch nicht mit dem Wahrheitswert der Menge c zu tun, sondern prüft, ob c tatsächlich eine Menge und kein Nullwert ist.
Wenn Sie überprüfen möchten, ob eine Menge in einer bedingten Anweisung leer ist, wird sie im Kontext als Boolescher Wert umgewandelt, sodass Sie einfach sagen können:
Wenn Sie jedoch möchten, dass es in einen Booleschen Wert konvertiert wird, können Sie einfach sagen:
quelle
quelle
Nicht so sauber wie bool (c), aber es war eine Ausrede, ternär zu verwenden.
Wenn Sie ein bisschen der gleichen Logik verwenden, müssen Sie c nicht zuweisen, es sei denn, Sie verwenden es für etwas anderes.
Schließlich würde ich annehmen, dass Sie einen True / False-Wert möchten, da Sie damit eine Art Booleschen Test durchführen werden. Ich würde empfehlen, den Overhead eines Funktionsaufrufs und einer Definition zu überspringen, indem Sie einfach testen, wo Sie ihn benötigen.
Anstatt:
Vielleicht das:
quelle