Python中的字典小写
Posted
技术标签:
【中文标题】Python中的字典小写【英文标题】:Dictionary to lowercase in Python 【发布时间】:2010-10-20 08:06:46 【问题描述】:我希望这样做,但要一本字典:
"My string".lower()
有内置函数还是应该使用循环?
【问题讨论】:
用于键、值或两者? 【参考方案1】:您将需要使用循环或列表/生成器理解。如果你想小写所有的键和值,你可以这样做::
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())
Generator expressions(上面使用过)通常用于构建字典;我一直在使用它们。循环理解的所有表现力,没有任何内存开销。
【讨论】:
这假设键是字符串。如果你有一个数值作为键,它将失败。dict.iteritems()
已从 Python 3 中删除,而是使用 dict.items()
。
如果有一个项目 'A':4 和 'a':5 会发生什么。我怎样才能把两者加起来变成'a':9【参考方案2】:
以下内容与 Rick Copeland 的答案相同,只是没有使用生成器表达式:
outdict =
for k, v in 'My Key': 'My Value'.iteritems():
outdict[k.lower()] = v.lower()
生成器表达式、列表推导和(在 Python 2.7 及更高版本中)字典推导基本上是重写循环的方法。
在 Python 2.7+ 中,您可以使用字典解析(它是一行代码,但您可以重新格式化它们以使其更具可读性):
k.lower():v.lower()
for k, v in
'My Key': 'My Value'.items()
它们通常比循环等效项更整洁,因为您不必初始化一个空的 dict/list/etc.. 但是,如果您需要做的不仅仅是单个函数/方法调用,它们很快就会变成乱七八糟的。
【讨论】:
对于字典有多个键且每个键>1个值的情况,如何概括这一点?【参考方案3】:如果您想要多嵌套字典(json 格式)小写的键和值,这可能会有所帮助。 需要支持 Python 2.7
中的 dict 理解dic = '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 中,使用 items(),而不是 iteritems() 和 str 而不是 basestring,如果你不想降低你的值,在我的情况下它们是列表,只需删除 elif 子句检查列表(列表无论如何都不能是键) 此解决方案适用于多嵌套字典。我将按照@lava-lava 的建议添加解决方案 + 添加对集合和元组的检查。如果 2.7 版本在 dict 创建中进行小改动以支持 OrderedDict(在 3.0 dict 中按 def 排序)【参考方案4】:python 3 中的更短方式: k.lower(): v for k, v in my_dict.items()
【讨论】:
【参考方案5】:这将小写你所有的 dict 键。即使您有嵌套的字典或列表。您可以执行类似的操作来应用其他转换。
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]
【讨论】:
【参考方案6】:我先使用JSON库反序列化字典,应用小写而不是转换回字典
import json
mydict = 'UPPERCASE': 'camelValue'
print(mydict)
mydict_in_str = json.dumps(mydict)
mydict_lowercase = json.loads(mydict_in_str.lower())
print(mydict_lowercase)
【讨论】:
【参考方案7】:如果提供的字典有多种类型的键/值(数字、字符串等);然后使用以下解决方案。
例如;如果你有一个名为 mydict 的字典,如下所示
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
【参考方案8】:
在 Python 3 中:
d = dict()
d = k.casefold(): v for k, v in d.items()
【讨论】:
【参考方案9】:喜欢你可以使用多级函数的方式,这是我将键小写的方式
def to_lower(dictionary):
def try_iterate(k):
return lower_by_level(k) if isinstance(k, dict) else k
def try_lower(k):
return k.lower() if isinstance(k, str) else k
def lower_by_level(data):
return dict((try_lower(k), try_iterate(v)) for k, v in data.items())
return lower_by_level(dictionary)
【讨论】:
【参考方案10】:我回答得这么晚了——因为这个问题被标记为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
【讨论】:
【参考方案11】:在Python 3
你可以这样做:
dict((k.lower(), v.lower()) for k,v in 'Key':'Value'.items())
在Python 2
中,只需将.items()
替换为.iteritems()
:
dict((k.lower(), v.lower()) for k,v in 'Key':'Value'.iteritems())
【讨论】:
【参考方案12】:def convert_to_lower_case(data):
if type(data) is dict:
for k, v in data.iteritems():
if type(v) is str:
data[k] = v.lower()
elif type(v) is list:
data[k] = [x.lower() for x in v]
elif type(v) is dict:
data[k] = convert_to_lower_case(v)
return data
【讨论】:
以上是关于Python中的字典小写的主要内容,如果未能解决你的问题,请参考以下文章
re.sub() 的不区分大小写的正则表达式模式问题[重复]