使用字典理解将字典中的所有键转换为小写

时间:2018-04-05 07:23:57

标签: python dictionary

我写了一个函数将字典中的所有键转换为小写:

def lower_dict_keys(some_dict):
    """Convert all keys to lowercase"""
    result = {}
    for key, value in some_dict.items():
        if type(key) == str:
            result[key.lower()] = value
        else:
            result[key] = value
    return result

到目前为止一切顺利。然后我想,嗯,这在字典理解中会更优雅,所以这就是我提出来的:

def lower_dict_keys2(some_dict):
    return {key.lower(): value for key, value in some_dict.items() if type(key) == str}

仅当所有键都是字符串时才有效。我有数字键,它们被删除了:

d1 = {'A':'foo', 'b':'bar', 1:'zip'}

print(lower_dict_keys(d1))

>>>{'a': 'foo', 'b': 'bar', 1: 'zip'}

print(lower_dict_keys2(d1))

>>>{'a': 'foo', 'b': 'bar'}

所以我的问题是:是否可以将此函数编写为字典理解?

2 个答案:

答案 0 :(得分:5)

将代码正确翻译为理解是:

{key.lower() if type(key) == str else key: value for key, value in some_dict.items()}

使用conditional expression确定每个键值对的键。

在元素上的if循环过滤器之后使用for ;那些未通过if测试的元素不包含在输出中。

您还希望避免使用type(...) is,而是使用isinstance(); str的子类也将支持lower()方法:

{key.lower() if isinstance(key, str) else key: value for key, value in some_dict.items()}

答案 1 :(得分:0)

如果您希望您的密钥通常是字符串,那么更合适的解决方案是使用try / except子句。

这里我们捕获AttributeError,它只会出现在非字符串元素中。

def lower_dict_keys(some_dict):
    """Convert all keys to lowercase"""
    result = {}
    for key, value in some_dict.items():
        try:
            result[key.lower()] = value
        except AttributeError:
            result[key] = value
    return result

d1 = {'A':'foo', 'b':'bar', 1:'zip'}

lower_dict_keys(d1)

# {'a': 'foo', 'b': 'bar', 1: 'zip'}

不幸的是,这不适用于字典理解,因为statements are not permitted in comprehensionsPEP-463 was rejected