Python 中的小写字典

问题描述 投票:0回答:13

我想这样做但是为了一本字典:

"My string".lower()

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

python dictionary lowercase
13个回答
104
投票

您将需要使用循环或列表/生成器理解。如果你想小写所有的键和值,你可以这样做::

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

生成器表达式(上面用到)在构建字典时经常有用;我一直在使用它们。没有内存开销的循环理解的所有表现力。


15
投票

如果你想要多嵌套字典(json 格式)小写的键和值,这可能会有所帮助。 需要支持字典理解 Python 2.7

中应该有什么
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

14
投票

以下内容与 Rick Copeland 的回答相同,只是没有使用 using 生成器表达式:

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

它们通常比等效的循环更整洁,因为您不必初始化一个空的字典/列表/等。但是,如果您需要做的不仅仅是单个函数/方法调用,它们很快就会变得混乱。


14
投票

python 3 中的较短方式:

{k.lower(): v for k, v in my_dict.items()}


5
投票

这将小写你所有的字典键。即使你有嵌套的字典或列表。您可以做类似的事情来应用其他转换。

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}]}}

4
投票

我先使用 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)

3
投票

在 Python 3 中:

d = dict()
d = {k.casefold(): v for k, v in d.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())

注意: 这在单维词典上效果很好


2
投票

我这么晚才回答-因为问题被标记为

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}

1
投票

喜欢使用多级函数的方式,这是我将键小写的方式

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

1
投票

一个选项是从 UserDict 子类型,这样所有插入的数据都会有小写键,你不需要在访问时关心小写:

from collections import UserDict
from typing import Any

class InsensitiveCaseDict(UserDict):
    def __getitem__(self, key: Any) -> Any:
        if type(key) is str:
            return super().__getitem__(key.lower())
        return super().__getitem__(key)

    def __setitem__(self, key: Any, item: Any) -> Any:
        if type(key) is str:
            self.data[key.lower()] = item
            return
        self.data[key] = item

你可以转换你原来的字典:

lowercase_dict = InsensitiveCaseDict(my_original_dict)

-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
© www.soinside.com 2019 - 2024. All rights reserved.