Notez que faire un dictionnaire insensible à la casse, par quelque moyen que, pourrait bien perdre des informations: par exemple, comment voulez-vous « Case- insensibiliser "{'a': 23, 'A': 45}
?! Si tout ce que vous aimez est là une clé est dans le dict ou non (autrement dit, ne se soucient pas de ce que la valeur correspond à elle), puis faire une place set
- à savoir
theset = set(k.lower() for k in thedict)
(dans toutes les versions de Python , ou {k.lower() for k in thedict}
si vous êtes satisfait de votre code fonctionnant uniquement en Python 2.7 ou version ultérieure pour des raisons de syntaxe purement décorative sucre ;-), et vérifiez avec if k.lower() in theset: ...
.
Ou, vous pourriez faire une classe d'emballage, par exemple, peut-être une lecture seule ...:
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())
Cela permet de garder (sans réellement altérer le dictionnaire original, donc toutes les informations précises peut encore être récupérer pour cela, si et quand nécessaire) une valeur arbitraire de valeurs possibles multiples pour les clés qui "s'effondrent" en une seule clé en raison de l'insensibilité à la casse, et offre toutes les méthodes de dictionnaires en lecture seule (avec les clés de chaîne, uniquement) plus une méthode actual_key_case
renvoyant le mélange de cas réel utilisé pour une clé de chaîne donnée (ou None
si aucune modification de cas de cette clé de chaîne donnée ne correspond à une clé dans le dictionnaire).
Voulez-vous des solutions explicites? J'ai utilisé la carte --- c'est comme ça que j'ai lu la question la première fois. –
Voir [PEP-455] (https://www.python.org/dev/peps/pep-0455/): ceci est prévu pour l'inclusion de la bibliothèque standard dans Python 3.5 (comme 'collections.TransformDict', à condition que la transformation soit 'str.casefold' ou similaire) –
[PEP-455 a finalement été rejetée.] (https://www.python.org/dev/peps/pep-0455/#rejection) –