【问题标题】:[del]eting an item from a JSON dictionary leaves an empty dict: `{}`. How do I remove it completely?[删除]从 JSON 字典中删除一个项目会留下一个空字典:`{}`。如何完全删除它?
【发布时间】:2017-10-14 12:24:07
【问题描述】:

我正在尝试删除嵌套在字典中的列表中的字典项。
在我del 对象之后,修改后的字典将包含一个空字典:{} 代替已删除的对象。
这是我正在使用的代码:

json_dict = {"top_key": "top_value", "bottom_key": [{"list_dict": "list_dict_value"},{"list_dict1": "list_dict_value1"}]}

print("initial:", json_dict)

def delete(list_dict):
    for i in json_dict["bottom_key"]:
        if list_dict in i:
            del i[list_dict]


delete("list_dict")
print("final:", json_dict)  

最后的打印会返回:
final: {'bottom_key': [{}, {'list_dict1': 'list_dict_value1'}], 'top_key': 'top_value'} (pw-retriever) simon@[pw-retriever](fix_del_ls)

我正在尝试找到一种方法来一次性删除除键:值对之外的{}

编辑:对到底发生了什么的解释也将不胜感激。

【问题讨论】:

  • 所有的内部字典都只有一个键吗?
  • @schwobaseggl 驻留在列表中的内部字典都是一键:一值
  • 您可以使用del i,但要安全地执行此操作,您必须反向遍历列表。或者按照 schwobaseggl 的建议复制一份列表进行迭代。

标签: python json python-3.x dictionary


【解决方案1】:

您可以执行以下操作:

for i in json_dict["bottom_key"][:]:  # important: iterate a shallow copy
    if list_dict in i:
        json_dict["bottom_key"].remove(i)

但是,由于从列表中删除的是O(N),并且您可能需要删除多个元素,因此您可以考虑一次性从头开始重建它:

json_dict["bottom_key"] = [d for d in json_dict["bottom_key"] if list_dict not in d]

【讨论】:

  • @PM2Ring 很高兴知道 :) 但有时其他人刚刚发布的答案太相似而无法保留我的答案。或者某事已经出现,阻止你完善你的答案,所以你宁愿删除它而不是让它保持原样。
  • @schwobaseggl 关于“#important:”评论:你只是指出你做了一个浅拷贝吗?
  • 是的。如果没有 [:] 切片,当您从正在迭代的集合中删除时,行为可能会变得丑陋。
  • @simonsays 正如我上面所说,从您正在向前迭代的列表中删除内容是不安全的。这就像锯掉你坐在的树枝。如果你切错了方向,就会发生坏事。 ;) 玩一些例子,你会明白我的意思。你可以在这里看到一些例子:Remove items from a list while iterating
【解决方案2】:

根据您的结构进一步构造,del 使用dict 的索引,如下所示:

def delete(list_dict):
    for i,ele in enumerate(json_dict["bottom_key"][:]) :
        if list_dict in ele:
            del json_dict["bottom_key"][i]

#driver 值:

IN : initial: {'top_key': 'top_value', 'bottom_key': [{'list_dict': 'list_dict_value'}, {'list_dict1': 'list_dict_value1'}]}

>>> delete("list_dict")

OUT : final: {'top_key': 'top_value', 'bottom_key': [{'list_dict1': 'list_dict_value1'}]}

编辑:schwobaseggl's 重构字典的想法比删除元素要好,因为前一个可能导致逻辑错误。

【讨论】:

  • 如果有更多实例要删除,这将无法正常工作。您在迭代时删除了一些东西......索引将不再匹配。
  • @schwobaseggl,真的。正如您所提到的,使用浅拷贝更好。感谢您指出。
猜你喜欢
  • 2023-03-10
  • 2013-03-01
  • 1970-01-01
  • 2022-08-08
  • 1970-01-01
  • 2012-08-31
  • 2011-08-16
  • 2021-11-18
  • 1970-01-01
相关资源
最近更新 更多