【问题标题】:Deleting Items based on Keys in nested Dictionaries in python根据python中嵌套字典中的键删除项目
【发布时间】:2018-06-09 13:55:41
【问题描述】:

我有一个看起来像这样的字典:

{
    'key1': 
        {
            'a': 'key1', 
            'b': 'val1', 
            'c': 'val2'
        }, 
    'key2': 
        {
            'a': 'key2', 
            'b': 'val3', 
            'c': 'val4'
        }, 
    'key3': 
        {
            'a': 'key3', 
            'b': 'val5', 
            'c': 'val6'
        }
}

我试图根据键“a”删除嵌套字典中的元素以获得如下输出:

{
    'key1': 
        {
            'b': 'val1', 
            'c': 'val2'
        }, 
    'key2': 
        {
            'b': 'val3', 
            'c': 'val4'
        }, 
    'key3': 
        {
            'b': 'val5', 
            'c': 'val6'
        }
}

我为它写了如下sn-p:

for k in dict_to_be_deleted:
    del k["a"]

我不断收到 Key Error: k not found。我也尝试了以下方法:

for i in dict_to_be_deleted:
    for k,v in i.items():
        if "a" in k:
            del i[k]

我明白了

Attribute Error: str object has no attribute items

但它不应该是一个字典,因为dict_to_be_deleted 是一个嵌套字典吗?我对此很困惑。我非常感谢这方面的任何指示。

【问题讨论】:

    标签: python python-3.x dictionary nested key


    【解决方案1】:

    一个简单的方法是改用dict.pop()

    data = {
            'key1': 
                {
                'a': 'key1', 
                'b': 'val1', 
                'c': 'val2'
                }, 
            'key2': 
                {
                'a': 'key2', 
                'b': 'val3', 
                'c': 'val4'
                }, 
            'key3': 
                {  
                'a': 'key3', 
                'b': 'val5', 
                'c': 'val6'
                }
            }
    
    for key in data:
        data[key].pop('a', None)
    
    print(data)
    

    哪些输出:

    {'key1': {'b': 'val1', 'c': 'val2'}, 'key2': {'b': 'val3', 'c': 'val4'}, 'key3': {'b': 'val5', 'c': 'val6'}}
    

    dict.pop() 的工作方式是首先检查键是否在字典中,在本例中为 "a",然后将其删除并返回其值。否则,返回一个默认值,在本例中为None,它可以防止KeyError

    【讨论】:

      【解决方案2】:

      当您遍历字典时,dict_to_be_deleted 您只是在遍历键。因此,在您的第二次尝试中,您的 Attribute Error 是因为 i 是键,而不是字典的字符串。您如何实际执行它是使用 .values() 来迭代值。

      for v in dict_to_be_deleted.values():
          del v["a"]
      

      但是,就个人而言,我建议不要删除元素,而是遵循 Ajax 的方法并构建一个没有丢失元素的新字典。像我们在这里所做的那样奇怪的突变是获取错误的简单方法。

      【讨论】:

      • 这怎么“怪”?
      • 非常感谢您的快速帮助。我也采纳了您的建议来创建一个新的 dict 以确保代码效率。
      • @StefanPochmann “怪异”可能是错误的词,但为了避免可能的副作用,请始终尝试并犯错。如果这被包装为函数的某个部分,那么您传入的参数突然会发生变化,而您可能没有意识到这一点。然而,复制字典总是安全的(只要你复制得足够深)。
      • @Ravi 您从头开始创建整个东西...为了效率
      • @StefanPochmann 我想在那种情况下,我的直觉更多是关于创建一个复制 Counter 的字典,而不是实际的 dict 突变。清晰胜出。 (实际上只使用Counter 回答该问题确实是最好的)。我的感觉,除非你有理由不这样做,否则请注意安全。
      【解决方案3】:

      在这种情况下,最好过滤字典的内容:

      d = {
      'key1': 
          {
              'a': 'key1', 
              'b': 'val1', 
              'c': 'val2'
          }, 
       'key2': 
          {
              'a': 'key2', 
              'b': 'val3', 
              'c': 'val4'
          }, 
      'key3': 
          {
              'a': 'key3', 
              'b': 'val5', 
              'c': 'val6'
          }
       }
      new_d = {a:{c:d for c, d in b.items() if c != 'a'} for a, b in d.items()}
      

      输出:

      {'key3': {'c': 'val6', 'b': 'val5'}, 'key2': {'c': 'val4', 'b': 'val3'}, 'key1': {'c': 'val2', 'b': 'val1'}}
      

      【讨论】:

        【解决方案4】:

        你可以简单地使用两个字典的函数和列表理解 pop() & itervalues()

        [value.pop('a', None) for value in d.itervalues()]

        打印 d

        输出 > {'key3': {'c': 'val6', 'b': 'val5'}, 'key2': {'c': 'val4', 'b ': 'val3'}, 'key1': {'c': 'val2', 'b': 'val1'}}

        优点:不占用额外内存。因为我们没有在这里创建新的字典

        如果您正在寻找简单的@Ajax1234 答案更具描述性

        【讨论】:

          【解决方案5】:

          当您可以提取所需内容时,为什么要删除?这是 collections.defaultdict(dict) 方法:

          data={
              'key1':
                  {
                      'a': 'key1',
                      'b': 'val1',
                      'c': 'val2'
                  },
              'key2':
                  {
                      'a': 'key2',
                      'b': 'val3',
                      'c': 'val4'
                  },
              'key3':
                  {
                      'a': 'key3',
                      'b': 'val5',
                      'c': 'val6'
                  }
          }
          
          import collections
          
          dict_1=collections.defaultdict(dict)
          for key,value in data.items():
              for key_1,value_1 in value.items():
                  if key!='a':
                      dict_1[key][key_1]=value_1
          
          print(dict_1)
          

          输出:

          {
            "key1": {
              "b": "val1",
              "c": "val2"
            },
            "key2": {
              "b": "val3",
              "c": "val4"
            },
            "key3": {
              "b": "val5",
              "c": "val6"
            }
          }
          

          【讨论】:

            猜你喜欢
            • 2020-10-20
            • 1970-01-01
            • 1970-01-01
            • 2019-11-18
            • 1970-01-01
            • 1970-01-01
            • 2017-03-08
            • 2015-01-26
            相关资源
            最近更新 更多