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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于python中嵌套字典中的键删除项目相关的知识,希望对你有一定的参考价值。

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

{
    '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是一个嵌套字典,所以它不是一本字典吗?我很困惑。我非常感谢这方面的任何指示。

答案

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

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

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

另一答案

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

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'}}
另一答案

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

另一答案

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

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

打印d

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

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

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

另一答案

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

以上是关于基于python中嵌套字典中的键删除项目的主要内容,如果未能解决你的问题,请参考以下文章

如何在嵌套字典中查找所有出现的键,同时跟踪外部字典键值?

如何重命名字典列表中深度嵌套的键(Python 3)?

具有相同键的(嵌套)字典的 Pythonic 替代方案?

使用列表中的项目更改嵌套字典的字典中的值?

当行内容是相关键的键值(每列的标题)时,如何用python在csv中编写嵌套字典?

在 python 中删除某些嵌套的 JSON 对象时遇到问题