基于python中嵌套字典中的键删除项目

时间:2017-12-29 04:09:23

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

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

{
    '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'
        }
}

我为它编写了以下代码:

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

我一直收到关键错误:找不到k。我也尝试了以下方法:

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是嵌套字典,因此它不是字典吗?我很困惑。我非常感谢这方面的任何指示。

5 个答案:

答案 0 :(得分:4)

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

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

然而,就个人而言,我建议不要删除元素,而是建议遵循Ajax的方法并构建一个没有缺少元素的新字典。奇怪的突变就像我们在这里做的那样,是一种容易出错的方法。

答案 1 :(得分: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'}}

答案 2 :(得分:3)

一种简单的方法是使用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

答案 3 :(得分:1)

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

  

[value.pop('a',None)表示d.itervalues()中的值

     

打印d

     

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

好处:它不会占用额外的内存。因为我们不是在这里创建新的词典

如果你正在寻找简洁@ Ajax1234答案更具描述性

答案 4 :(得分:0)

当您可以提取所需内容时,为什么要删除?这是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"
  }
}