Case insensitive dictionary

后端 未结 10 2454
栀梦
栀梦 2020-11-27 14:47

I\'d like my dictionary to be case insensitive.

I have this example code:

text = \"practice changing the color\"

words = {\'color\': \'colour\',
            


        
10条回答
  •  甜味超标
    2020-11-27 15:13

    The currently approved answer doesn't work for a lot of cases, so it cannot be used as a drop-in dict replacement. Some tricky points in getting a proper dict replacement:

    • overloading all of the methods that involve keys
    • properly handling non-string keys
    • properly handling the constructor of the class

    The following should work much better:

    class CaseInsensitiveDict(dict):
        @classmethod
        def _k(cls, key):
            return key.lower() if isinstance(key, basestring) else key
    
        def __init__(self, *args, **kwargs):
            super(CaseInsensitiveDict, self).__init__(*args, **kwargs)
            self._convert_keys()
        def __getitem__(self, key):
            return super(CaseInsensitiveDict, self).__getitem__(self.__class__._k(key))
        def __setitem__(self, key, value):
            super(CaseInsensitiveDict, self).__setitem__(self.__class__._k(key), value)
        def __delitem__(self, key):
            return super(CaseInsensitiveDict, self).__delitem__(self.__class__._k(key))
        def __contains__(self, key):
            return super(CaseInsensitiveDict, self).__contains__(self.__class__._k(key))
        def has_key(self, key):
            return super(CaseInsensitiveDict, self).has_key(self.__class__._k(key))
        def pop(self, key, *args, **kwargs):
            return super(CaseInsensitiveDict, self).pop(self.__class__._k(key), *args, **kwargs)
        def get(self, key, *args, **kwargs):
            return super(CaseInsensitiveDict, self).get(self.__class__._k(key), *args, **kwargs)
        def setdefault(self, key, *args, **kwargs):
            return super(CaseInsensitiveDict, self).setdefault(self.__class__._k(key), *args, **kwargs)
        def update(self, E={}, **F):
            super(CaseInsensitiveDict, self).update(self.__class__(E))
            super(CaseInsensitiveDict, self).update(self.__class__(**F))
        def _convert_keys(self):
            for k in list(self.keys()):
                v = super(CaseInsensitiveDict, self).pop(k)
                self.__setitem__(k, v)
    

提交回复
热议问题