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

Posted

技术标签:

【中文标题】根据python中嵌套字典中的键删除项目【英文标题】:Deleting Items based on Keys in nested Dictionaries in 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 是一个嵌套字典吗?我对此很困惑。我非常感谢这方面的任何指示。

【问题讨论】:

【参考方案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"
  

【讨论】:

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

根据字典中的键值检查列表中的值,Python

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

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

如何根据字典中的键/值增加 Python Pandas DataFrame

python根据字典的值进行排序:

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