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
是一个嵌套字典吗?我对此很困惑。我非常感谢这方面的任何指示。
一个简单的方法是使用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
.
当您迭代字典时,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 的方法并构建一个没有缺失元素的新字典。像我们在这里所做的那样奇怪的突变是获取错误的一种简单方法。
在这种情况下,最好过滤字典的内容:
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)
归档时间: |
|
查看次数: |
4530 次 |
最近记录: |