Tenga en cuenta que hacer un diccionario de mayúsculas y minúsculas, por lo tanto, también puede perder información: por ejemplo, ¿cómo se "caso- insensibilizar "{'a': 23, 'A': 45}
?! Si todo lo que importa es que una llave está en la dict o no (es decir, no se preocupan por lo que el valor corresponde a la misma), a continuación, hacer una set
lugar - es decir
theset = set(k.lower() for k in thedict)
(en todas las versiones de Python o {k.lower() for k in thedict}
si está contento con su código que solo funciona en Python 2.7 o posterior por el bien de un azucar de sintaxis puramente decorativa ;-), y consulte con if k.lower() in theset: ...
.
O, usted podría hacer una clase de contenedor, por ejemplo, tal vez un solo lectura uno ...:
import collections
class CaseInsensitiveDict(collections.Mapping):
def __init__(self, d):
self._d = d
self._s = dict((k.lower(), k) for k in d)
def __contains__(self, k):
return k.lower() in self._s
def __len__(self):
return len(self._s)
def __iter__(self):
return iter(self._s)
def __getitem__(self, k):
return self._d[self._s[k.lower()]]
def actual_key_case(self, k):
return self._s.get(k.lower())
Esto mantendrá (sin llegar a alterar el diccionario original, por lo toda la información precisa todavía puede ser recuperar para ello, si es necesario) un arbitrario de valores posiblemente múltiples para claves que se "colapsan" en una sola tecla debido a la insensibilidad a mayúsculas y minúsculas, y ofrecen todos los métodos de solo lectura de diccionarios (solo con claves de cadena) más un método actual_key_case
que devuelve la combinación de casos real utilizada para cualquier clave de cadena determinada (o None
si ninguna alteración de mayúsculas o minúsculas de esa clave de serie dada concuerda con ninguna tecla en el diccionario).
¿Quería soluciones explícitas? utilicé el mapa --- así es como leí la pregunta la primera vez. –
Ver [PEP-455] (https://www.python.org/dev/peps/pep-0455/): está programado para la inclusión de una biblioteca estándar en Python 3.5 (como 'collections.TransformDict', siempre que la transformación sea 'str.casefold' o similar) –
[PEP-455 fue finalmente rechazado.] (https://www.python.org/dev/peps/pep-0455/#rejection) –