在python中根据嵌套字典中的键删除项目

Rav*_*mar 5 python dictionary nested key python-3.x

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

{
    'key1': 
        {
            'a': 'key1', 
            'b': 'val1', 
            'c': 'val2'
        }, 
    'key2': 
        {
            'a': 'key2', 
            'b': 'val3', 
            'c': 'val4'
        }, 
    'key3': 
        {
            'a': 'key3', 
            'b': 'val5', 
            'c': 'val6'
        }
}
Run Code Online (Sandbox Code Playgroud)

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

{
    'key1': 
        {
            'b': 'val1', 
            'c': 'val2'
        }, 
    'key2': 
        {
            'b': 'val3', 
            'c': 'val4'
        }, 
    'key3': 
        {
            'b': 'val5', 
            'c': 'val6'
        }
}
Run Code Online (Sandbox Code Playgroud)

我为它编写了以下代码段:

for k in dict_to_be_deleted:
    del k["a"]
Run Code Online (Sandbox Code Playgroud)

我不断收到密钥错误:找不到 k。我也尝试了以下方法:

for i in dict_to_be_deleted:
    for k,v in i.items():
        if "a" in k:
            del i[k]
Run Code Online (Sandbox Code Playgroud)

我得到

Attribute Error: str object has no attribute items
Run Code Online (Sandbox Code Playgroud)

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

Roa*_*ner 7

一个简单的方法是使用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)
Run Code Online (Sandbox Code Playgroud)

哪个输出:

{'key1': {'b': 'val1', 'c': 'val2'}, 'key2': {'b': 'val3', 'c': 'val4'}, 'key3': {'b': 'val5', 'c': 'val6'}}
Run Code Online (Sandbox Code Playgroud)

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


SCB*_*SCB 5

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

for v in dict_to_be_deleted.values():
    del v["a"]
Run Code Online (Sandbox Code Playgroud)

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

  • @StefanPochmann 我想在那种情况下,我的直觉更多的是创建一个复制 `Counter` 的字典,而不是实际的 dict 突变。清晰胜出。(实际上只是使用`Counter` 来回答那个问题确实是最好的一个)。我的感觉,除非你有理由不这样做,否则要安全。 (2认同)

Aja*_*234 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()}
Run Code Online (Sandbox Code Playgroud)

输出:

{'key3': {'c': 'val6', 'b': 'val5'}, 'key2': {'c': 'val4', 'b': 'val3'}, 'key1': {'c': 'val2', 'b': 'val1'}}
Run Code Online (Sandbox Code Playgroud)