switch - Python: compruebe si el valor está en una lista sin importar el CaSE
switch if python (5)
Quiero verificar si un valor está en una lista, sin importar cuál sea el caso de las letras, y debo hacerlo de manera eficiente.
Esto es lo que tengo:
if val in list:
Pero quiero que ignore el caso
Puede bajar los valores y verificarlos:
>>> val
''CaSe''
>>> l
[''caSe'', ''bar'']
>>> val in l
False
>>> val.lower() in (i.lower() for i in l)
True
Si realmente tiene solo una lista de los valores, lo mejor que puede hacer es algo así como
if val.lower() in [x.lower() for x in list]: ...
pero probablemente sería mejor mantener, por ejemplo, un set
o dict
cuyas claves son versiones en minúsculas de los valores en la lista; de esa manera no necesitará seguir iterando (potencialmente) toda la lista.
Por cierto, usar list
como nombre de variable es estilo pobre, porque list
es también el nombre de uno de los tipos incorporados de Python. Es probable que intentes llamar a la función integrada de la list
(que convierte las cosas en listas) y te confundas porque tu variable de list
no se puede llamar. O, por el contrario, tratando de usar su variable de list
algún lugar donde esté fuera del alcance y confundirse porque no puede indexar en la list
integrada.
Si sabes que tus valores son todos de tipo str
o unicode
, puedes probar esto:
if val in map(str.lower, list):
...Or:
if val in map(unicode.lower, list):
check = "asdf"
checkLower = check.lower()
print any(checkLower == val.lower() for val in ["qwert", "AsDf"])
# prints true
Usando la función any () Este método es bueno porque no está recreando la lista para que tenga minúsculas, se itera sobre la lista, por lo que una vez que encuentra un valor verdadero, deja de iterar y regresa.
Demostración: http://codepad.org/dH5DSGLP
items = [''asdf'', ''Asdf'', ''asdF'', ''asjdflk'', ''asjdklflf'']
itemset = set(i.lower() for i in items)
val = ''ASDF''
if val.lower() in itemset: # O(1)
print(''wherever you go, there you are'')