【问题标题】:Delete dictionary element based on a value in a nested dictionary in a list根据列表中嵌套字典中的值删除字典元素
【发布时间】:2019-06-04 04:35:50
【问题描述】:

我正在尝试使用列表删除嵌套字典中的元素。因此,我有一个列表,其中有一个字典作为其元素之一,然后又将字典作为其键值之一。我知道我将在最顶层列表和最底层字典中使用的键,而“中间”字典中的键是可变的。如果底部字典中的某个值不等于某个值,我想删除“中间”字典中的元素。

我想我需要三个嵌套的 for 循环才能进入每个字典,但无法弄清楚如何删除“中间”字典中的元素。

我目前的尝试:

#remove unneccessary elements
def getCleanResults(the_dict1):
    for elem1 in the_dict1:
        the_dict2 = elem['dict1_key']
        for key, elem2 in the_dict2.keys():
            the_dict3 = elem2[key]
            for elem3 in the_dict3:
                if 'keyWanted' in elem3:
                    del elem2
    return the_dict

词典列表的模板我有:

a = {
        {'key1':{'key1.1': {'delete': True, 'result': None},
        'key1.2': {'delete': False, 'result': None}},'key2': 3},
        {'key1':{'key1.1': {'delete': False, 'result': None},
        'key1.2': {'delete': True, 'result': None}},'key2': 5}
}

我想删除下面有'delete'True 的键keyx.x,根据上面的示例,这将产生:

a = {
    {'key1':{'key1.2': {'delete': False, 'result': None}},'key2': 3},
    {'key1':{'key1.1': {'delete': False, 'result': None}},'key2': 5}
}

如上例所示,他们删除的键是 key1.1key1.2,因此是可变的。

【问题讨论】:

  • 我认为您提供的嵌套字典有很多语法错误。你能修复你的字典,让它准确地代表你的数据结构,看看它在你的机器上是否有任何语法错误吗?另外,我认为您的意思是删除上一段中“删除”为True 的键?
  • a 不是有效的字典。请更正。
  • 修复了a 字典。
  • 它已被@Slam 修复,现在再次修复后它不再是有效的字典...您的密钥不能是字典,因为它不可散列。在你的情况下,你的键必须是一个字符串,而值是一个字典,它有自己的字符串键,另一个字典作为它自己的值。
  • @KaanTheGuru,a 仍然不是有效的字典,因为它没有键,只有值。

标签: python python-3.x dictionary nested


【解决方案1】:

我猜,您的挣扎来自 Python 对在迭代期间修改字典的限制。要制作您想要的内容,您需要制作您的 dict 的副本 — 制作副本、迭代并从原始副本中删除键;或迭代原始密钥并将“过滤”密钥放入新密钥。以后可以用

b = {k1: {k2: v2 for k2, v2 in v1.items() if not v2['delete']}
     for k1, v1 in a.items()}

编辑:由于某种原因,您提供的代码没有一致性,上面的解决方案是假设结构实际上是

a = {'key1.1': {'key1.1.1': {'delete': True, 'loremipsum': 'perhaps'},
                'key1.1.2': {'delete': False, 'loremipsum': 'perhaps'}},
     'key1.2': {'key1.2.1': {'delete': False, 'loremipsum': 'perhaps'},
                'key1.2.2': {'delete': False, 'loremipsum': 'perhaps'}},
     'key2.1': {'key2.1.1': {'delete': False, 'loremipsum': 'perhaps'},
                'key2.1.2': {'delete': False, 'loremipsum': 'perhaps'}},
     'key2.2': {'key2.2.1': {'delete': False, 'loremipsum': 'perhaps'},
                'key2.2.2': {'delete': True, 'loremipsum': 'perhaps'}}
}

b = {'key1.1': {'key1.1.2': {'delete': False, 'loremipsum': 'perhaps'}},
     'key1.2': {'key1.2.1': {'delete': False, 'loremipsum': 'perhaps'},
                'key1.2.2': {'delete': False, 'loremipsum': 'perhaps'}},
     'key2.1': {'key2.1.1': {'delete': False, 'loremipsum': 'perhaps'},
                'key2.1.2': {'delete': False, 'loremipsum': 'perhaps'}},
     'key2.2': {'key2.2.1': {'delete': False, 'loremipsum': 'perhaps'}}
}

【讨论】:

    【解决方案2】:

    如果您对字典 a 使用正确的语法,您可以遍历第一层键,然后像您说的那样,做一个嵌套循环来遍历第二层键。 the_dict1[key1][key2] 中的 VALUE 是最终的字典。我使用 pprint 来帮助可视化字典。

    def getCleanResults(the_dict1):
        # iterate through the first keys, cast as a tuple to make a copy of the keys iterator (allows for changing dictionary size during iteration)
        for key1 in tuple(the_dict1.keys()):
            the_dict2 = the_dict1[key1]
            # iterate through the second tier keys
            for key2 in tuple(the_dict2.keys()):
                if the_dict1[key1][key2]['delete']:
                    del the_dict1[key1][key2]
        # no need to return a new dict, it was passed by reference, we modified the original dict. If you wanted a copy of the dict, make copy and return it instead.
    

    正确格式的字典:

    a = {
        'key1.1': {'key1.1.1': {'delete': True, 'loremipsum': 'perhaps'},
                    'key1.1.2': {'delete': False, 'loremipsum': 'perhaps'}},
        'key1.2': {'key1.2.1': {'delete': False, 'loremipsum': 'perhaps'},
                'key1.2.2': {'delete': False, 'loremipsum': 'perhaps'}},
        'key2.1': {'key2.1.1': {'delete': False, 'loremipsum': 'perhaps'},
                'key2.1.2': {'delete': False, 'loremipsum': 'perhaps'}},
        'key2.2': {'key2.2.1': {'delete': False, 'loremipsum': 'perhaps'},
                'key2.2.2': {'delete': True, 'loremipsum': 'perhaps'}}
    }
    

    测试:

    from pprint import pprint
    
    getCleanResults(a)
    print()
    pprint(a)
    

    输出:

    {'key1.1': {'key1.1.2': {'delete': False, 'loremipsum': 'perhaps'}},
     'key1.2': {'key1.2.1': {'delete': False, 'loremipsum': 'perhaps'},
                'key1.2.2': {'delete': False, 'loremipsum': 'perhaps'}},
     'key2.1': {'key2.1.1': {'delete': False, 'loremipsum': 'perhaps'},
                'key2.1.2': {'delete': False, 'loremipsum': 'perhaps'}},
     'key2.2': {'key2.2.1': {'delete': False, 'loremipsum': 'perhaps'}}}
    

    【讨论】:

      【解决方案3】:

      你可以这样试试。

      代码sn-p

      import json
      
      def delete_items(d):
          keys1 = d.keys()
          new_d = {}
      
          for key1 in keys1:
              keys2 = d[key1].keys();
              for key2 in keys2:
                  if type(d[key1][key2]) is dict:
                      if d[key1][key2]["delete"] == False:
                          if key1 in new_d:
                              new_d[key1][key2] = d[key1][key2]
                          else:
                              new_d[key1] = {key2: d[key1][key2]}
                  else:
                      if key1 in d:
                          new_d[key1] = {key2: d[key1][key2]}
                      else:
                          new_d[key1][key2] = d[key1][key2]
      
          return new_d
      
      
      a = {
              "key1.1": {
                  "key1.1.1": {
                      "delete": True,
                      "loremipsum": "perhaps"
                  },
                  "key1.1.2": {
                      "delete": False,
                      "loremipsum": "perhaps"
                  },
                  "key1.1.3": 4
              },
              "key1.2": {
                  "key1.2.1": {
                      "delete": False,
                      "loremipsum": "perhaps"
                  },
                  "key1.2.2": {
                      "delete": False,
                      "loremipsum": "perhaps"
                  }
              },
              "key2.1": {
                  "key2.1.1": {
                      "delete": False,
                      "loremipsum": "perhaps"
                  },
                  "key2.1.2": {
                      "delete": False,
                      "loremipsum": "perhaps"
                  },
                  "key2.1.3": 9
              },
              "key2.2": {
                  "key2.2.1": {
                      "delete": False,
                      "loremipsum": "perhaps"
                  },
                  "key2.2.2": {
                      "delete": True,
                      "loremipsum": "perhaps"
                  },
                  "key2.2.3": 2
              }
          }
      
      d = delete_items(a)
      print(json.dumps(d, indent=4))
      

      输出

      {
          "key1.2": {
              "key1.2.1": {
                  "delete": false,
                  "loremipsum": "perhaps"
              },
              "key1.2.2": {
                  "delete": false,
                  "loremipsum": "perhaps"
              }
          },
          "key1.1": {
              "key1.1.3": 4,
              "key1.1.2": {
                  "delete": false,
                  "loremipsum": "perhaps"
              }
          },
          "key2.1": {
              "key2.1.3": 9
          },
          "key2.2": {
              "key2.2.3": 2
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-20
        • 1970-01-01
        • 2021-12-08
        • 1970-01-01
        • 1970-01-01
        • 2016-05-06
        相关资源
        最近更新 更多