Ich Liebe den Ausdruck
if 'MICHAEL89' in USERNAMES:
...
wo USERNAMES
ist eine Liste
Gibt es eine Möglichkeit, die mit Elementen übereinstimmen mit Fall-Gefühllosigkeit oder brauche ich eine eigene Methode? Einfach Fragen, wenn es nötig ist, um zusätzlichen code schreiben.
Danke an alle!
InformationsquelleAutor RadiantHex | 2010-09-02
Alternativ:
Oder, ja, können Sie eine benutzerdefinierte Methode.
if 'CaseFudge'.lower() in [x.lower() for x in list]
[...]
schafft die ganze Liste.(name.upper() for name in USERNAMES)
schaffen würde, nur einen generator und man brauchte string auf ein time - massive Speicher-Einsparungen, wenn Sie tun, diese operation sehr. (noch mehr Einsparungen, wenn Sie erstellen Sie einfach eine Liste von Benutzernamen in Kleinbuchstaben, verwenden Sie für die überprüfung die jedes mal)Lieber alle unteren Tasten, die beim erstellen des dict, aus performance-Gründen.
wenn [x ist.lower() for x in Liste] ist eine list comprehension ist (name.upper() for name in BENUTZERNAMEN) ein Tupel Verständnis? Oder hat es einen anderen Namen?
Es ist ein generator-Ausdruck.
InformationsquelleAutor nmichaels
Ich würde einen wrapper so können Sie nicht-invasiv. Minimal, zum Beispiel...:
Nun
if CaseInsensitively('MICHAEL89') in whatever:
sich Verhalten sollte (ob Sie in der rechten Seite ist eine Liste, dict, oder ein set). (Es kann erfordern mehr Aufwand zu erreichen ähnliche Ergebnisse für string-Aufnahme, vermeiden Sie die Warnungen in einigen Fällen mitunicode
etc).Xavier: Du brauchst
CaseInsensitively('MICHAEL89') in {CaseInsensitively('Michael89'):True}
für diese Arbeit, die vermutlich nicht fallen, unter "sich Verhalten, als notwendig".So viel für das es nur 1 offensichtliche Weg, es zu tun. Dieser fühlt sich schwer an, es sei denn, es wird zu viel verwendet. Das heißt, es ist sehr glatt.
es scheint mir, dass mit invasiv alter der container ist das "fühlt sich schwer an" Betrieb. Eine komplett nicht-invasive wrapper: wie viel "leichter" als das könnte man die bekommen?! Nicht viel;-). @Xavier, RHS, dicts oder Sätze mit groß-und Kleinbuchstaben Schlüssel/Gegenstände müssen Ihre eigenen, nicht-invasive Wrapper (Teil des kurzen
etc.
und "erfordern mehr Aufwand" Teile meiner Antwort;-).Meine definition von heavy ist das schreiben ein bisschen code, um etwas, das nur einmal verwendet werden, wo eine weniger robuste, aber viel kürzere version tun würde. Wenn dies wird mehr als einmal verwendet werden, es ist vollkommen vernünftig.
InformationsquelleAutor Alex Martelli
In der Regel (in der oop zumindest) Sie gestalten Ihr Objekt zu Verhalten, wie Sie wollen.
name in USERNAMES
ist nicht groß-und Kleinschreibung, soUSERNAMES
ändern muss:Die große Sache über dieses ist, dass es öffnet den Weg für viele Verbesserungen, ohne änderungen am code außerhalb der Klasse. Zum Beispiel könnten Sie ändern den
self.names
zu einem set für schnellere Suchvorgänge oder berechnen Sie die(n.lower() for n in self.names)
nur einmal und speichern Sie es auf die Klasse und so weiter ...InformationsquelleAutor Jochen Ritzel
Ich glaube, Sie haben zu schreiben zusätzlichen code. Zum Beispiel:
In diesem Fall bilden wir eine neue Liste mit allen Einträgen in
USERNAMES
zu Großbuchstaben konvertiert und dann verglichen gegen diese neue Liste.Update
Als @viraptor sagt, noch besser ist es, mit Hilfe eines Generators statt
map
. Sehen @Nathon's Antwort.itertools
Funktionimap
. Es ist viel schneller als ein generator, aber erreicht das gleiche Ziel.InformationsquelleAutor Manoj Govindan
Könnten Sie tun,
Update: ein wenig rumprobiert und bin zu denken, Sie könnten sich einen besseren short-circuit-Art-Ansatz mit
Den
ifilter
Funktion von itertools, einer meiner Lieblings-Module in Python. Es ist schneller als ein generator, sondern schafft nur der nächste Punkt auf der Liste, wenn aufgerufen.InformationsquelleAutor wheaties
str.casefold
ist empfohlen für case-insensitive Stringvergleich. @nmichaels Lösung kann trivial angepasst werden.Entweder:
Oder:
Als pro die docs:
InformationsquelleAutor jpp
Hier ist eine Möglichkeit:
Für diese Arbeit, sowohl
string1
undstring2
Objekte müssen vom Typstring
.das ist, weil eines Ihrer Elemente ist eine Liste, und beide Objekte sollte ein string sein. Das Objekt ist eine Liste?
Ich würde Stimmen, aber ich kann nicht, es sei denn, Sie Bearbeiten Ihre Antwort. Sie haben absolut Recht.
Ich fügte hinzu, eine Klarstellung.
InformationsquelleAutor User
Meine 5 (falsch) Cent
UPDATE
Autsch, voll und ganz Zustimmen @jpp, ich halten werde, als ein Beispiel für schlechte Praxis 🙁
'a' in "".join(['AB']).lower()
zurückTrue
wenn dies ist nicht, was der OP will.InformationsquelleAutor GBrian