Ich liebe es, den Ausdruck zu benutzen
if 'MICHAEL89' in USERNAMES:
...
Wo USERNAMES
ist eine Liste.
Gibt es eine Möglichkeit, Elemente mit Groß- und Kleinschreibung zu vergleichen, oder muss ich eine benutzerdefinierte Methode verwenden? Ich frage mich nur, ob dafür zusätzlicher Code geschrieben werden muss.
python
string
list
case-insensitive
RadiantHex
quelle
quelle
if 'CaseFudge'.lower() in [x.lower() for x in list]
[...]
erstellt die gesamte Liste.(name.upper() for name in USERNAMES)
würde immer nur einen Generator und einen benötigten String gleichzeitig erstellen - massive Speichereinsparungen, wenn Sie diesen Vorgang häufig ausführen. (Noch mehr Einsparungen, wenn Sie einfach eine Liste von Benutzernamen in Kleinbuchstaben erstellen, die Sie jedes Mal zur Überprüfung verwenden)Ich würde einen Wrapper machen, damit Sie nicht invasiv sein können. Minimal zum Beispiel ...:
Jetzt
if CaseInsensitively('MICHAEL89') in whatever:
sollte sich wie erforderlich verhalten (ob die rechte Seite eine Liste, ein Diktat oder eine Menge ist). (Es kann mehr Aufwand erfordern, um ähnliche Ergebnisse für das Einfügen von Zeichenfolgen zu erzielen. Vermeiden Sie in einigen Fällen Warnungenunicode
usw.).quelle
CaseInsensitively('MICHAEL89') in {CaseInsensitively('Michael89'):True}
funktionieren, was wahrscheinlich nicht unter "Verhalten wie erforderlich" fällt.etc.
und Teile meiner Antwort "erfordern mehr Aufwand" ;-).Normalerweise (zumindest in oop) formen Sie Ihr Objekt so, dass es sich so verhält, wie Sie es möchten.
name in USERNAMES
ist nicht unabhängig von Groß- und Kleinschreibung,USERNAMES
muss also geändert werden:Das Tolle daran ist, dass es den Weg für viele Verbesserungen öffnet, ohne dass Code außerhalb der Klasse geändert werden muss. Sie können beispielsweise
self.names
das für schnellere Suchvorgänge in ein Set ändern oder das(n.lower() for n in self.names)
nur einmal berechnen und in der Klasse speichern und so weiter ...quelle
str.casefold
wird für den String-Abgleich ohne Berücksichtigung der Groß- und Kleinschreibung empfohlen. @ nmichaels Lösung kann trivial angepasst werden.Benutze das eine oder das andere:
Oder:
Gemäß den Dokumenten :
quelle
Hier ist eine Möglichkeit:
Damit dies funktioniert, müssen sowohl
string1
als auchstring2
Objekte vom Typ seinstring
.quelle
Ich denke, Sie müssen zusätzlichen Code schreiben. Beispielsweise:
In diesem Fall erstellen wir eine neue Liste mit allen Einträgen in
USERNAMES
Großbuchstaben konvertiert sind, und vergleichen sie dann mit dieser neuen Liste.Aktualisieren
Wie @viraptor sagt, ist es sogar besser, einen Generator anstelle von zu verwenden
map
. Siehe @Nathon ‚s Antwort .quelle
itertools
Funktion verwendenimap
. Es ist viel schneller als ein Generator, erreicht aber das gleiche Ziel.Du könntest es tun
Update: ein bisschen herumgespielt und denke, Sie könnten einen besseren Kurzschluss-Ansatz verwenden
Die
ifilter
Funktion stammt von itertools, einem meiner Lieblingsmodule in Python. Es ist schneller als ein Generator, erstellt jedoch nur bei Bedarf das nächste Element der Liste.quelle
Meine 5 (falschen) Cent
AKTUALISIEREN
Autsch, stimme vollkommen zu @jpp, ich werde als Beispiel für schlechte Praxis behalten :(
quelle
'a' in "".join(['AB']).lower()
kehrt ,True
wenn dies ist nicht das, was OP will.Ich brauchte dies für ein Wörterbuch anstelle einer Liste. Die Jochen-Lösung war die eleganteste für diesen Fall, also habe ich sie ein wenig modifiziert:
Jetzt können Sie ein Wörterbuch wie dieses konvertieren
USERNAMESDICT = CaseInsensitiveDict(USERNAMESDICT)
und verwendenif 'MICHAEL89' in USERNAMESDICT:
quelle
Um es in einer Zeile zu haben, habe ich Folgendes getan:
Ich habe es allerdings nicht zeitlich getestet. Ich bin mir nicht sicher, wie schnell / effizient es ist.
quelle