【问题标题】:Convert all keys in dictionary to lower case with dictionary comprehension使用字典理解将字典中的所有键转换为小写
【发布时间】:2018-04-05 07:23:56
【问题描述】:

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

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

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

【问题讨论】:

  • 如果键不是字符串,你想发生什么?
  • 就像在原始函数中一样,它应该被原封不动地添加到字典中。

标签: python dictionary


【解决方案1】:

你的代码正确的理解是:

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

【讨论】:

  • 晚 2 秒 :)... +1
【解决方案2】:

如果您期望您的键通常是字符串,更合适的解决方案是使用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

【讨论】:

    猜你喜欢
    • 2015-08-24
    • 2014-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-06
    • 1970-01-01
    • 2012-10-17
    相关资源
    最近更新 更多