我有一个看起来像这样的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
是嵌套字典,因此它不是字典吗?我很困惑。我非常感谢这方面的任何指示。
答案 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"
}
}