【问题标题】:Dictionary to lowercase in PythonPython中的字典小写
【发布时间】:2010-10-20 08:06:46
【问题描述】:

我希望这样做,但要一本字典:

"My string".lower()

有内置函数还是应该使用循环?

【问题讨论】:

  • 用于键、值或两者?

标签: python dictionary lowercase


【解决方案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.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}
            

            【讨论】:

              【解决方案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
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2012-10-17
                  • 1970-01-01
                  • 1970-01-01
                  • 2021-04-08
                  • 1970-01-01
                  • 1970-01-01
                  • 2012-11-04
                  • 1970-01-01
                  相关资源
                  最近更新 更多