我写了一个函数将字典中的所有键转换为小写:
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
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.然后我想,嗯,这在词典理解中会更优雅,所以这就是我提出的:
def lower_dict_keys2(some_dict):
return {key.lower(): value for key, value in some_dict.items() if type(key) == str}
Run Code Online (Sandbox Code Playgroud)
这仅适用于所有键都是字符串的情况.我有数字键,它们被丢弃:
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'}
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:是否可以将此函数编写为字典理解?
将代码正确翻译为理解是:
{key.lower() if type(key) == str else key: value for key, value in some_dict.items()}
Run Code Online (Sandbox Code Playgroud)
使用条件表达式确定每个键值对的键.
使用if 后的for环路滤波器上的元素; 那些未通过if测试的元素不包含在输出中.
你也想避免使用type(...) is,isinstance()改用; 子类也str将支持该lower()方法:
{key.lower() if isinstance(key, str) else key: value for key, value in some_dict.items()}
Run Code Online (Sandbox Code Playgroud)