我写了一个函数将字典中的所有键转换为小写:
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'}
所以我的问题是:是否可以将此函数编写为字典理解?
答案 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 comprehensions和PEP-463 was rejected。