list
Typ Python hat seine __contains__
Methode implemented in C:
static int
list_contains(PyListObject *a, PyObject *el)
{
Py_ssize_t i;
int cmp;
for (i = 0, cmp = 0 ; cmp == 0 && i < Py_SIZE(a); ++i)
cmp = PyObject_RichCompareBool(el, PyList_GET_ITEM(a, i),
Py_EQ);
return cmp;
}
Eine wörtliche Übersetzung Python sein könnte:
def list_contains(a, el):
cmp = False
for i in range(len(a)):
if cmp: break
cmp = a[i] == el
return cmp
Ihr Beispiel ist eine idiomatische Übersetzung.
In jedem Fall, wie die anderen Antworten bemerkt haben, verwendet es Gleichheit, um die Listenelemente gegen das Element zu testen, das Sie auf Mitgliedschaft überprüfen. Mit float
Werten, die gefährlich sein können, da Zahlen, die wir erwarten, gleich zu sein, möglicherweise nicht auf Gleitkomma-Rundung zurückzuführen sind.
Eine float
-safe Art und Weise von der selbst sein könnte, überprüfen Umsetzung:
any(abs(x - el) < epsilon for x in a)
wo epsilon
etwas kleiner Wert ist. Wie klein es sein muss, hängt von der Größe der Zahlen ab, mit denen Sie es zu tun haben, und davon, wie genau Sie sich interessieren.Wenn Sie den Betrag des numerischen Fehlers schätzen können, der el
einen äquivalenten Wert in der Liste unterscheiden könnte, können Sie epsilon
um eine Größenordnung größer einstellen und sicher sein, dass Sie kein falsches Negativ geben (und wahrscheinlich nur falsche positive Ergebnisse geben) Fälle, die unmöglich zu bekommen sind).
Vielleicht möchten Sie [hier] (http://stackoverflow.com/questions/2217001/override-in-operator-in-python) sehen. Der 'in'-Operator sollte bevorzugt werden, da er einen speziellen Containment-Test verwenden kann, der vom Container angeboten wird (z.B.' set .__ contains __() 'ist viel schneller als' list .__ contains __() '). Das Problem ist mit dem "float" -Teil, weil das Vergleichen von Floats aus verschiedenen Quellen für Gleichheit normalerweise ein numerisches No-Go ist. – dhke
Ja. Vergleichen von Floats für Gleichheit ist am besten zu vermeiden, für die [üblichen Gründe] (http://stackoverflow.com/questions/588004/is-floating-point-math-broken?rq=1). –
Eine mögliche Alternative besteht darin, die Liste der Gleitkommazahlen zu sortieren und die binäre Suche zu verwenden, um die beste Übereinstimmung zu finden, zu subtrahieren und zu prüfen, ob die Differenz unter einem bestimmten Grenzwert liegt. –