Me encanta usar la expresión
if 'MICHAEL89' in USERNAMES:
...
donde USERNAMES
hay una lista
¿Hay alguna manera de hacer coincidir los elementos con mayúsculas y minúsculas o necesito usar un método personalizado? Me pregunto si es necesario escribir código adicional para esto.
python
string
list
case-insensitive
RadiantHex
fuente
fuente
if 'CaseFudge'.lower() in [x.lower() for x in list]
[...]
crea la lista completa.(name.upper() for name in USERNAMES)
crearía solo un generador y una cadena necesaria a la vez: un ahorro masivo de memoria si realiza muchas veces esta operación. (incluso más ahorros, si simplemente crea una lista de nombres de usuario en minúsculas que reutiliza para verificar cada vez)Haría un envoltorio para que no seas invasivo. Mínimamente, por ejemplo ...:
Ahora,
if CaseInsensitively('MICHAEL89') in whatever:
debe comportarse como se requiere (ya sea que el lado derecho sea una lista, dict o set). (Puede requerir más esfuerzo lograr resultados similares para la inclusión de cadenas, evitar advertencias en algunos casos que involucrenunicode
, etc.).fuente
CaseInsensitively('MICHAEL89') in {CaseInsensitively('Michael89'):True}
que eso funcione, lo que probablemente no se clasifique como "comportarse como se requiere".etc.
y "requieren más esfuerzo" de mi respuesta ;-).Por lo general (en al menos al menos) le das forma a tu objeto para que se comporte de la manera que quieras.
name in USERNAMES
no distingue entre mayúsculas y minúsculas, por lo queUSERNAMES
debe cambiar:Lo mejor de esto es que abre el camino para muchas mejoras, sin tener que cambiar ningún código fuera de la clase. Por ejemplo, podría cambiarlo
self.names
a un conjunto para búsquedas más rápidas, o calcular la(n.lower() for n in self.names)
única vez y almacenarlo en la clase, etc.fuente
str.casefold
se recomienda para la coincidencia de cadenas entre mayúsculas y minúsculas. La solución de @nmichaels se puede adaptar trivialmente.Utilizar cualquiera:
O:
Según los documentos :
fuente
Aquí hay una manera:
Para que esto funcione, ambos
string1
y losstring2
objetos deben ser de tipostring
.fuente
Creo que tienes que escribir un código extra. Por ejemplo:
En este caso, estamos formando una nueva lista con todas las entradas en
USERNAMES
convertidas a mayúsculas y luego comparándolas con esta nueva lista.Actualizar
Como dice @viraptor , es aún mejor usar un generador en lugar de
map
. Ver la respuesta de @Nathon .fuente
itertools
funciónimap
. Es mucho más rápido que un generador pero logra el mismo objetivo.Podrías hacerlo
Actualización: jugué un poco y estoy pensando que podría obtener un mejor enfoque de tipo de cortocircuito utilizando
La
ifilter
función es de itertools, uno de mis módulos favoritos dentro de Python. Es más rápido que un generador, pero solo crea el siguiente elemento de la lista cuando se le solicita.fuente
Mis 5 centavos (incorrectos)
ACTUALIZAR
Ay, totalmente de acuerdo @jpp, lo guardaré como un ejemplo de mala práctica :(
fuente
'a' in "".join(['AB']).lower()
devolucionesTrue
cuando esto no es lo que OP quiere.Necesitaba esto para un diccionario en lugar de una lista, la solución Jochen fue la más elegante para ese caso, así que la modifiqué un poco:
ahora puedes convertir un diccionario así
USERNAMESDICT = CaseInsensitiveDict(USERNAMESDICT)
y usarif 'MICHAEL89' in USERNAMESDICT:
fuente
Para tenerlo en una línea, esto es lo que hice:
Sin embargo, no lo probé en el tiempo. No estoy seguro de lo rápido / eficiente que es.
fuente