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

Nat*_*tim 10 python json simplejson django-piston

我有一个dict,我想使用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": ""
    },
Run Code Online (Sandbox Code Playgroud)

编辑:谢谢大家看看我的问题,对不起,我没有详细解释为什么我想要这个.这是修补JSONEmitterdjango-piston.

Fre*_*urk 25

>>> 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}}
Run Code Online (Sandbox Code Playgroud)

  • 在python 3上你可以使用理解而且不需要`dict(...)` - >`d = {k.lower():v代表k,v代表d.items()}` (6认同)

von*_*hev 8

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

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'
Run Code Online (Sandbox Code Playgroud)

  • 或者,只需要`__setitem__`做`dict .__ setitem __(self,key.lower(),val)`.这种方法的问题一般是构造函数和`.update`不使用__setitem__ - 你需要解决这个问题,或者`LowerCaseDict({'Foo':1,'bar':2})`不会按预期运行(不会以我的方式小写它或不会为你的方式引发TypeError). (6认同)

Nat*_*tim 5

这是我的解决方案:

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
Run Code Online (Sandbox Code Playgroud)