J'aime utiliser l'expression
if 'MICHAEL89' in USERNAMES:
...
où USERNAMES
est une liste.
Existe-t-il un moyen de faire correspondre les éléments avec insensibilité à la casse ou dois-je utiliser une méthode personnalisée? Je me demande simplement s'il est nécessaire d'écrire du code supplémentaire pour cela.
python
string
list
case-insensitive
RadiantHex
la source
la source
if 'CaseFudge'.lower() in [x.lower() for x in list]
[...]
crée la liste entière.(name.upper() for name in USERNAMES)
créerait seulement un générateur et une chaîne nécessaire à la fois - des économies de mémoire massives si vous faites beaucoup cette opération. (encore plus d'économies, si vous créez simplement une liste de noms d'utilisateurs en minuscules que vous réutilisez pour vérifier à chaque fois)Je ferais un emballage pour que vous puissiez être non invasif. Au minimum, par exemple ...:
Maintenant,
if CaseInsensitively('MICHAEL89') in whatever:
devrait se comporter comme requis (que le côté droit soit une liste, un dict ou un ensemble). (Cela peut nécessiter plus d'efforts pour obtenir des résultats similaires pour l'inclusion de chaînes, éviter les avertissements dans certains cas impliquantunicode
, etc.).la source
CaseInsensitively('MICHAEL89') in {CaseInsensitively('Michael89'):True}
pour que cela fonctionne, ce qui ne relève probablement pas de "se comporter comme requis".etc.
et "nécessitent plus d'effort" de ma réponse ;-).Habituellement (au moins en oop) vous façonnez votre objet pour qu'il se comporte comme vous le souhaitez.
name in USERNAMES
n'est pas insensible à la casse, ilUSERNAMES
faut donc changer:La grande chose à ce sujet est que cela ouvre la voie à de nombreuses améliorations, sans avoir à changer de code en dehors de la classe. Par exemple, vous pouvez changer le
self.names
en un ensemble pour des recherches plus rapides, ou calculer le(n.lower() for n in self.names)
seul une fois et le stocker sur la classe et ainsi de suite ...la source
str.casefold
est recommandé pour la correspondance de chaînes insensible à la casse. La solution de @ nmichaels peut être facilement adaptée.Utilisez soit:
Ou:
Selon les documents :
la source
Voici une façon:
Pour que cela fonctionne, les objets
string1
etstring2
doivent être de typestring
.la source
Je pense que vous devez écrire du code supplémentaire. Par exemple:
Dans ce cas, nous formons une nouvelle liste avec toutes les entrées
USERNAMES
converties en majuscules, puis comparons avec cette nouvelle liste.Mettre à jour
Comme le dit @viraptor , il est encore mieux d'utiliser un générateur au lieu de
map
. Voir la réponse de @Nathon .la source
itertools
fonctionimap
. C'est beaucoup plus rapide qu'un générateur mais accomplit le même objectif.Vous pourriez faire
Mise à jour: joué un peu et je pense que vous pourriez obtenir une meilleure approche de type court-circuit en utilisant
La
ifilter
fonction provient d'itertools, l'un de mes modules préférés dans Python. Il est plus rapide qu'un générateur mais ne crée l'élément suivant de la liste que lorsqu'il est appelé.la source
Mes 5 (faux) cents
METTRE À JOUR
Aïe, totalement d'accord @jpp, je vais garder comme exemple de mauvaise pratique :(
la source
'a' in "".join(['AB']).lower()
retoursTrue
lorsque ce n'est pas ce que OP veut.J'en avais besoin pour un dictionnaire au lieu d'une liste, la solution Jochen était la plus élégante pour ce cas, alors je l'ai un peu modifiée:
maintenant vous pouvez convertir un dictionnaire comme ça
USERNAMESDICT = CaseInsensitiveDict(USERNAMESDICT)
et utiliserif 'MICHAEL89' in USERNAMESDICT:
la source
Pour l'avoir en une seule ligne, voici ce que j'ai fait:
Cependant, je ne l'ai pas testé avec le temps. Je ne sais pas à quel point c'est rapide / efficace.
la source