94 votes

Dictionnaire insensible à la casse

J'aimerais que mon dictionnaire insensibles à la casse.

J'ai ce code d'exemple:

text = "practice changing the color"

words = {'color': 'colour',
        'practice': 'practise'}

def replace(words,text):

    keys = words.keys()

    for i in keys:
        text= text.replace(i ,words[i])
    return  text

text = replace(words,text)

print text

Sortie = pratique de changer la couleur

J'aimerais une autre chaîne "pratique de la modification de la Couleur" (où "Couleur" commence par une majuscule) aussi donner le même résultat.

Je crois qu'il existe une façon générale, à convertir en minuscules, à l'aide de mydictionary[key.lower()] mais je ne suis pas sûr de la façon de mieux les intégrer dans mon code existant. (Si ce serait raisonnable, approche simple de toute façon).

75voto

santiagobasulto Points 5081

Juste pour info. J'ai trouvé une impressionnante impementation sur Requests :

https://github.com/kennethreitz/requests/blob/v1.2.3/requests/structures.py#L37

48voto

jkp Points 20410

Si je vous ai bien compris et que vous souhaitez utiliser des dictionnaires clés de manière non sensible à la casse, vous pouvez notamment sous-classer dict et surcharger le setter / getter:

 class CaseInsensitiveDict(dict):
    def __setitem__(self, key, value):
        super(CaseInsensitiveDict, self).__setitem__(key.lower(), value)

    def __getitem__(self, key):
        return super(CaseInsensitiveDict, self).__getitem__(key.lower())
 

14voto

inspectorG4dget Points 25092

Envisageriez-vous d'utiliser string.lower() sur vos entrées et d'utiliser un dictionnaire entièrement en minuscule? C'est un peu une solution de hacky, mais ça marche

3voto

Jakob Borg Points 10869

Bien qu'un dictionnaire insensible à la casse soit une solution et qu'il existe des solutions pour y parvenir, il existe un moyen plus simple dans ce cas. Une recherche insensible à la casse est suffisante:

 import re

text = "Practice changing the Color"
words = {'color': 'colour', 'practice': 'practise'}

def replace(words,text):
        keys = words.keys()
        for i in keys:
                exp = re.compile(i, re.I)
                text = re.sub(exp, words[i], text)
        return text

text = replace(words,text)
print text
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X