代码之家  ›  专栏  ›  技术社区  ›  Natim

如何确保python dict键是小写的?

  •  8
  • Natim  · 技术社区  · 14 年前

    我有一个要用simplejson在json中转换的dict。

    我怎样才能保证我听写的所有键都是小写的呢?

        {
            "DISTANCE": 17.059918745802999, 
            "name": "Foo Bar", 
            "Restaurant": {
                "name": "Foo Bar", 
                "full_address": {
                    "country": "France", 
                    "street": "Foo Bar", 
                    "zip_code": "68190", 
                    "city": "UNGERSHEIM"
                }, 
                "phone": "+33.389624300", 
                "longitude": "7.3064454", 
                "latitude": "47.8769091", 
                "id": "538"
            }, 
            "price": "", 
            "composition": "", 
            "profils": {}, 
            "type_menu": "", 
            "ID": ""
        },
    

    编辑:谢谢大家看了我的问题,很抱歉我没有详细解释为什么我想要这个。它是为了修补 JSONEmitter 属于 django-piston .

    6 回复  |  直到 6 年前
        1
  •  23
  •   Fred Nurk    10 年前
    >>> d = {"your": "DATA", "FROM": "above"}
    >>> dict((k.lower(), v) for k, v in d.iteritems())
    {'from': 'above', 'your': 'DATA'}
    >>> def lower_keys(x):
    ...   if isinstance(x, list):
    ...     return [lower_keys(v) for v in x]
    ...   elif isinstance(x, dict):
    ...     return dict((k.lower(), lower_keys(v)) for k, v in x.iteritems())
    ...   else:
    ...     return x
    ...
    >>> lower_keys({"NESTED": {"ANSWER": 42}})
    {'nested': {'answer': 42}}
    
        2
  •  8
  •   vonPetrushev    14 年前

    下面是一个禁止设置小写键的解决方案:

    class LowerCaseDict(dict):
        def __setitem__(self, key, val):
            if not key.islower():
                raise TypeError, "%s key must be lowercase" % key
            dict.__setitem__(self, key, val)
    
    ld = LowerCaseDict()
    ld['g']='g'
    
        3
  •  4
  •   Natim    14 年前

    这是我的解决方案:

    def lower_key(in_dict):
        if type(in_dict) is dict:
            out_dict = {}
            for key, item in in_dict.items():
                out_dict[key.lower()] = lower_key(item)
            return out_dict
        elif type(in_dict) is list:
            return [lower_key(obj) for obj in in_dict]
        else:
            return in_dict
    
        4
  •  4
  •   user225312    14 年前

    既然你没有明确地提到你想做什么:

    将所有密钥转换为小写:

    >>> y = dict((k.lower(), v) for k, v in x.iteritems())
    

    检查钥匙:

    >>> for k in x.iterkeys():
        if k.islower():
            print k, 'True'
        else:
            print k, 'False'
    
        5
  •  2
  •   Chris Morgan    14 年前

    如果你只是想 检查 如果它们都是小写的(您的措辞,使用“secure”,不清楚,但我怀疑这不是您想要的),您可以在一行中简洁地做到:

    all(k.islower() for k in x.iterkeys())
    
        6
  •  2
  •   sorin    9 年前

    这是一个完整的解决方案

    from requests import CaseInsensitiveDict
    

    或者如果您想查看代码:

    class CaseInsensitiveDict(dict):
    
        """Basic case insensitive dict with strings only keys."""
    
        proxy = {}
    
        def __init__(self, data):
            self.proxy = dict((k.lower(), k) for k in data)
            for k in data:
                self[k] = data[k]
    
        def __contains__(self, k):
            return k.lower() in self.proxy
    
        def __delitem__(self, k):
            key = self.proxy[k.lower()]
            super(CaseInsensitiveDict, self).__delitem__(key)
            del self.proxy[k.lower()]
    
        def __getitem__(self, k):
            key = self.proxy[k.lower()]
            return super(CaseInsensitiveDict, self).__getitem__(key)
    
        def get(self, k, default=None):
            return self[k] if k in self else default
    
        def __setitem__(self, k, v):
            super(CaseInsensitiveDict, self).__setitem__(k, v)
            self.proxy[k.lower()] = k