<p>我不认为<code>any(child for child in children.values())</code>是确定<code>children</code>是否应该保留在最终dict中的有效方法。这个表达式基本上等同于“这个dict是否至少有一个值不是空字符串?”。狗的dict有一个非空的孩子,所以它保留在你的最终dict中</p>
<p>以下是我将使用的方法。编写一个函数,该函数递归地迭代嵌套的数据结构并生成其所有键,而不管它们嵌套得有多深。对每个顶级键值对运行此函数,以标识所有子值的名称。然后创建一个新的dict,将这些名字从顶层排除。你知道吗</p>
<pre><code>def iter_all_keys(obj):
if not isinstance(obj, dict):
return
for key, value in obj.items():
yield key
for x in iter_all_keys(value):
yield x
d = {
"Animal": {
"Cat": [],
"Dog": {
"Labrador": {
"LabradorPup": []
}
}
},
"DieselCar": {
"Hyundai": []
},
"Dog": {
"Labrador": {
"LabradorPup": []
}
},
"ElectricCar": {
"Tesla": []
},
"Labrador": {
"LabradorPup": []
},
"PetrolCar": {
"Ford": [],
"Hyundai": []
},
"Vehicle": {
"DieselCar": {
"Hyundai": []
},
"ElectricCar": {
"Tesla": []
},
"PetrolCar": {
"Ford": [],
"Hyundai": []
}
}
}
child_names = {child_name for toplevel_name, toplevel_children in d.items() for child_name in iter_all_keys(toplevel_children)}
d = {key: value for key, value in d.items() if key not in child_names}
print(d)
</code></pre>
<p>结果(为清晰起见,我添加了空格):</p>
<pre><code>{
'Animal': {
'Dog': {
'Labrador': {
'LabradorPup': []
}
},
'Cat': []
},
'Vehicle': {
'DieselCar': {
'Hyundai': []
},
'PetrolCar': {
'Hyundai': [],
'Ford': []
},
'ElectricCar': {
'Tesla': []
}
}
}
</code></pre>
<p>请注意,这只会从顶层删除重复项。如果要在这样的字典上运行此代码:</p>
<pre><code>d = {
"Human":{
"Fred": [],
"Barney": []
},
"Caveman":{
"Fred": [],
"Barney": []
}
}
</code></pre>
<p>。。。结果dict将与输入相同。弗雷德和巴尼在数据结构中都出现过两次。如果这不是期望的结果,那么不清楚结果应该是什么。弗雷德和巴尼应该从人类还是穴居人身上除名?如果逻辑应该是“把弗雷德和巴尼留在人里面,因为那是我们第一次遇到的。去掉剩下的”,那么结果就不是确定的,因为2.7中的字典不能保证是有序的。你知道吗</p>