这有效:
def delete_empty_keys(d):
new_d = {}
for key,value in d.items():
if key != '' and not isinstance(value, dict):
new_d[key] = value
elif key != '' and isinstance(value, dict):
new_d[key] = delete_empty_keys(value)
else:
pass
return new_d
如何将其变成字典理解?我试过这个,但我不能让它工作,我最后应该有一个else pass
。
def delete_empty_keys(d):
return {key: value
if key != '' and not isinstance(value, dict)
else delete_empty_keys(value)
if key != '' and isinstance(value, dict)
#else pass??
for key, value in d.items()
}
你的循环
for key,value in d.items():
if key != '' and not isinstance(value, dict):
new_d[key] = value
elif key != '' and isinstance(value, dict):
new_d[key] = delete_empty_keys(value)
else:
pass
实际上只是测试是否应该跳过该键,或者如果不是,则如何处理该值。如果您将密钥测试拉出到单独的if
语句,则可以将其重写为
for key, value in d.items():
if key != '':
if not isinstance(value, dict):
new_d[key] = value
else:
new_d[key] = delete_empty_keys(value)
所以if key != '':
测试实际上是过滤项目,选择哪些应该是新词典的一部分。理解中的过滤是在循环中使用额外的if
组件完成的:
<item> for <target> in <iterable> if <test> # optional: more for loops and if tests
if <test>
部分过滤可迭代,限制使用的项目。在词典理解中使用相同的词汇。
这留下了内部if...else
测试,可以用条件表达式表示(在两个选项之间选取):
# iteration, for <target> in <iterable>
for key, value in d.items():
# filter, if <test>
if key != '':
# <item>, here a <key> and <value> expression for the dict comprehension
new_d[key] = value if not isinstance(value, dict) else delete_empty_keys(value)
现在您有一个可以转换为字典理解的表单:
{
key: value if not isinstance(value, dict) else delete_empty_keys(value)
for key, value in d.items()
if key != ''
}
或者,在你的功能中:
def delete_empty_keys(d):
return {key: value if not isinstance(value, dict) else delete_empty_keys(value)
for key, value in d.items() if key != ''}
好吧,如果你真的想这样做:
def delete_empty_keys(d):
return {k: delete_empty_keys(v) if isinstance(v, dict)
else v
for k, v in d.items() if k != ''}
例:
d = {'': 'delete_me',
'a': {'': {'delete': 'me',
'me': 'too'},
'dont': 'delete_me',
'keep': 'me'},
'b': {'': 'bye'},
'c': 'not_nested'}
delete_empty_keys(d)
输出:
{'a': {'dont': 'delete_me', 'keep': 'me'}, 'b': {}, 'c': 'not_nested'}
你在pass
理解中没有dict
,因为pass
没有返回任何东西。理解中的一切都应该归还一些东西。
此外,正如评论中所述:None != ''
。