我想在一个字典中这样做:
"My string".lower()
是否有内置函数,还是应该使用循环?
我想在一个字典中这样做:
"My string".lower()
是否有内置函数,还是应该使用循环?
您需要使用循环或列表/生成器推导式。如果您想将所有键和值都转换为小写,可以执行以下操作:
dict((k.lower(), v.lower()) for k,v in {'My Key':'My Value'}.iteritems())
如果您只想将键转换为小写,可以这样做:
dict((k.lower(), v) for k,v in {'My Key':'My Value'}.iteritems())
生成器表达式(在上面使用)通常用于构建字典;我一直在使用它们。具有循环推导的所有表现力,但没有任何内存开销。
dict.iteritems()
已被移除,请改用dict.items()
。 - Løitendic = {'A':['XX', 'YY', 'ZZ'],
'B':(u'X', u'Y', u'Z'),
'C':{'D':10,
'E':('X', 'Y', 'Z'),
'F':{'X', 'Y', 'Z'}
},
'G':{'X', 'Y', 'Z'}
}
PYTHON2.7 -- 也支持OrderedDict
def _lowercase(obj):
""" Make dictionary lowercase """
if isinstance(obj, dict):
t = type(obj)()
for k, v in obj.items():
t[k.lower()] = _lowercase(v)
return t
elif isinstance(obj, (list, set, tuple)):
t = type(obj)
return t(_lowercase(o) for o in obj)
elif isinstance(obj, basestring):
return obj.lower()
else:
return obj
PYTHON 3.6
def _lowercase(obj):
""" Make dictionary lowercase """
if isinstance(obj, dict):
return {k.lower():_lowercase(v) for k, v in obj.items()}
elif isinstance(obj, (list, set, tuple)):
t = type(obj)
return t(_lowercase(o) for o in obj)
elif isinstance(obj, str):
return obj.lower()
else:
return obj
Python 3 中更简洁的方式:{k.lower(): v for k, v in my_dict.items()}
outdict = {}
for k, v in {'My Key': 'My Value'}.iteritems():
outdict[k.lower()] = v.lower()
生成器表达式、列表推导式以及(在Python2.7及以上版本)字典推导式基本上是重写循环的方法。
在Python 2.7+版本中,你可以使用字典推导式(它只有一行代码,但你可以重新格式化它们以使其更易读):
{k.lower():v.lower()
for k, v in
{'My Key': 'My Value'}.items()
}
使用列表/字典解析通常比使用循环更整洁,因为你不必初始化一个空的dict/list等。但是,如果你需要执行多个函数/方法调用之外的任何操作,它们很快就会变得混乱。
def lowercase_keys(obj):
if isinstance(obj, dict):
obj = {key.lower(): value for key, value in obj.items()}
for key, value in obj.items():
if isinstance(value, list):
for idx, item in enumerate(value):
value[idx] = lowercase_keys(item)
obj[key] = lowercase_keys(value)
return obj
json_str = {"FOO": "BAR", "BAR": 123, "EMB_LIST": [{"FOO": "bar", "Bar": 123}, {"FOO": "bar", "Bar": 123}], "EMB_DICT": {"FOO": "BAR", "BAR": 123, "EMB_LIST": [{"FOO": "bar", "Bar": 123}, {"FOO": "bar", "Bar": 123}]}}
lowercase_keys(json_str)
Out[0]: {'foo': 'BAR',
'bar': 123,
'emb_list': [{'foo': 'bar', 'bar': 123}, {'foo': 'bar', 'bar': 123}],
'emb_dict': {'foo': 'BAR',
'bar': 123,
'emb_list': [{'foo': 'bar', 'bar': 123}, {'foo': 'bar', 'bar': 123}]}}
import json
mydict = {'UPPERCASE': 'camelValue'}
print(mydict)
mydict_in_str = json.dumps(mydict)
mydict_lowercase = json.loads(mydict_in_str.lower())
print(mydict_lowercase)
d = dict()
d = {k.casefold(): v for k, v in d.items()}
mydict = {"FName":"John","LName":"Doe",007:true}
在Python 2.x中
dict((k.lower() if isinstance(k, basestring) else k, v.lower() if isinstance(v, basestring) else v) for k,v in mydict.iteritems())
在Python 3.x中
dict((k.lower() if isinstance(k, str) else k, v.lower() if isinstance(v, str) else v) for k,v in mydict.iteritems())
注意:这在单维度字典上运行良好。
try_lower = lambda k: k.lower() if isinstance(k, str) else k
- Will S由于问题标记了Python
,所以回答比较晚。因此,我提供了适用于Python 2.x
和 Python 3.x
的解决方案,并处理了非字符串键的情况。
Python 2.x - 使用字典推导式
{k.lower() if isinstance(k, basestring) else k: v.lower() if isinstance(v, basestring) else v for k,v in yourDict.iteritems()}
演示:
>>> yourDict = {"Domain":"WORKGROUP", "Name": "CA-LTP-JOHN", 111: 'OK', "Is_ADServer": 0, "Is_ConnectionBroker": 0, "Domain_Pingable": 0}
>>> {k.lower() if isinstance(k, basestring) else k: v.lower() if isinstance(v, basestring) else v for k,v in yourDict.iteritems()}
{'domain': 'workgroup', 'name': 'ca-ltp-john', 'is_adserver': 0, 'is_connectionbroker': 0, 111: 'ok', 'domain_pingable': 0}
Python 3.x - Python 3.x 中没有 iteritems()
{k.lower() if isinstance(k, str) else k: v.lower() if isinstance(v, str) else v for k,v in yourDict.items()}
演示:
>>> dict((k.lower() if isinstance(k, basestring) else k, v.lower() if isinstance(v, basestring) else v) for k,v in yourDict.iteritems())
Traceback (most recent call last):
File "python", line 1, in <module>
AttributeError: 'dict' object has no attribute 'iteritems'
>>> {k.lower() if isinstance(k, str) else k: v.lower() if isinstance(v, str) else v for k,v in yourDict.items()}
>>> {'domain': 'workgroup', 'name': 'ca-ltp-john', 111: 'ok', 'is_adserver': 0, 'is_connectionbroker': 0, 'domain_pingable': 0}
dict((k.lower(), v.lower()) for k,v in {'Key':'Value'}.items())
.iteritems()
替换为.items()
:dict((k.lower(), v.lower()) for k,v in {'Key':'Value'}.iteritems())