2009-04-18 137 views
34

小写我想这样做,但对词典:词典在Python

"My string".lower() 

有一个内置的功能还是应该使用一个循环?

+0

的键,值,或两者兼而有之? – hasen 2009-04-18 21:30:47

+0

对于他们两个 – Teifion 2009-04-18 22:26:03

回答

64

您将需要使用循环或列表/发生器理解。如果你想小写的所有键和值,你可以,如果你想为小写只是按键为此::

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(以上使用)常常用于构建字典;我一直都在使用它们。循环理解的所有表达性,没有任何内存开销。

+1

这假设钥匙是字符串。如果你有一个数字值作为一个键,它会失败。 – lorenzog 2015-07-10 10:32:01

+2

`dict.iteritems()`从Python 3中移除,而不是使用`dict.items()`。 – 2016-08-02 15:31:26

13

以下是相同的里克·科普兰的答案,只是写没有使用生成器表达式:

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() 
} 

他们经常比循环整洁等价,因为你不必初始化一个空的字典/列表/等等。但是,如果你需要做的不只是一个函数/方法调用,他们可能很快变得混乱。

2

如果提供的字典有多种类型的键/值(数字,字符串等);然后使用以下解决方案。

例如;如果你有一个名为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()) 

注:这适用于单维词典

在Python
-1
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 
3

较短方式:{k.lower(): v for k, v in my_dict.items()}

0

如果你想键和嵌套的字典(JSON格式)小写的值,这可能帮助。 需要支持字典理解应该在Python 2中。7

def _lowercase(obj): 
     """ Make dictionary lowercase """ 
     if isinstance(obj, dict): 
      return {k.lower():_lowercase(v) for k, v in obj.iteritems()} 
     elif isinstance(obj, list): 
      return [_lowercase(k) for k in obj] 
     elif isinstance(obj, basestring): 
      return obj.lower() 
     else: 
      return obj 
0

爱您可以使用多级功能的方式,这是我的小写-ING键

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) 
1

我回答这个迟到的方式 - 因为这个问题被标记Python。 因此,回答Python 2.xPython 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}