我有一个嵌套字典,包含“密度”和“温度”的(子)dicts。结构如下:
profiles_dict =
{
"density": {
"elements": [
{
"layers": [
{
"top": 54.0,
"bottom": 3.75,
"value": 218.9
}
]
}
],
"type": "density"
},
"temperature": {
"elements": [
{
"layers": []
}
],
"type": "temperature"
}
}
正如在temperature子ct中可以看到的,“layers”键包含一个空列表作为值。我的目标是创建一个循环/函数来删除字典{"layers": []}
结果应该如下所示:
profiles_dict_new =
{
"density": {
"elements": [
{
"layers": [
{
"top": 54.0,
"bottom": 3.75,
"value": 218.9
}
]
}
],
"type": "density"
},
"temperature": {
"elements": [
],
"type": "temperature"
}
}
我尝试了以下方法:
for k1, v1 in profiles_dict.items():
for k2, v2 in v1.items():
if type(v2) != list:
continue
for i in v2:
for k3, v3 in i.items():
if v3 == []:
del(i)
通过这个循环,我可以访问{'layers': []}
,但是我不知道如何正确地将它从dictionray中删除
第二种方法基于Ajax1234解决方案(Deleting Items based on Keys in nested Dictionaries in python)
profiles_dict_new = {d:{e:[{l:v for l, v in e.items() if v != []}]} for d, e in profiles_dict.items()}
print(profiles_dict_new)
这给了我以下错误:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-11-126f19ab7afd> in <module>
----> 1 profiles_dict_new = {d:{e:[{l:v for l, v in e.items() if v != []}]} for d, e in profiles_dict.items()}
2 print(profiles_dict_new)
<ipython-input-11-126f19ab7afd> in <dictcomp>(.0)
----> 1 profiles_dict_new = {d:{e:[{l:v for l, v in e.items() if v != []}]} for d, e in profiles_dict.items()}
2 print(profiles_dict_new)
TypeError: unhashable type: 'dict'
对于所介绍的任何一种方法,我们都非常感谢您的帮助
很多文本,但您需要的是从
list
中删除dict
?! 您的列表不是i
(列表的元素),而是v2
,因此请确保为您的变量起好名字,并将for
更改为while
,因为在迭代过程中删除可能会导致问题如果}中的一个项目}中供以后使用。
如果}中存储
list
{dict
包含多个不为空的k3
,并且您不想将其删除,则可以将空的项目存储在新的list
{remove_keys
包含与整个dict
相同的数量,您可以从v2
中.pop(index)
它,否则.pop(key)
所有存储的密钥只能从当前dict
{而不是删除分配空列表
您可以尝试以下代码:
del
不删除对象:它删除名称。如果多个名称引用同一对象,则其他名称将保持不变取消绑定
i
循环变量对基础列表不起任何作用,而i
只是在下一次迭代中被重新分配。必须删除实际的列表元素v2[index_of_i]
,才能将其从列表中删除为了能够安全地执行此操作,您需要替换原始列表或向后迭代列表的副本。您也可以向前迭代,但是索引需要格外小心,以确保它考虑前面删除的元素
其次
i.items()
上的循环是适得其反的。您不希望找到一个包含某个键且其中包含空列表的词典。您需要一个只有一个键的字典,因此不需要循环向后迭代将允许您保留原始列表对象:
如果向前迭代,则必须复制列表才能正确执行,并对索引进行额外的簿记:
表达式
next(iter(...))
是一种常见的习惯用法,用于从只有一个元素但无法轻松索引的对象中获取单个元素,如dict
或set
。像pop
这样的方法是破坏性的:如果只想检查元素,就必须将其放回原处next(iter(...))
允许您查看集合相关问题 更多 >
编程相关推荐