从嵌套字典中删除键和值



我对编程还比较陌生,而且很困。

我下面有一本这样的字典。我想说喜欢n = "a"那么我想从字典中删除每个变量CCD_ 2。

然后我想删除下面这个嵌套字典中的每个字母a。我知道如何从字典中删除一些内容,但我现在很困惑,因为我不知道如何使用嵌套字典。在这种情况下,先有一个键,然后是一个值,但在值内部是另一个包含其他键和值的字典。我已经实现了for循环等,试图做我想做的事情,但我得到的解决方案不是我想要的。

谢谢:(

{'b': {'a': 7, 'c': 10, 'd': 15}, 'a': {'b': 7, 'c': 9, 'f': 14}, 'c': {'a': 9, 'b': 10, 'd': 11, 'f': 2}, 'f': {'a': 14, 'c': 2, 'e': 9}, 'd': {'b': 15, 'c': 11, 'e': 6}, 'e': {'d': 6, 'f': 9}}
dic = {'b': {'a': 7, 'c': 10, 'd': 15}, 'a': {'b': 7, 'c': 9, 'f': 14}, 'c': {'a': 9, 'b': 10, 'd': 11, 'f': 2}, 'f': {'a': 14, 'c': 2, 'e': 9}, 'd': {'b': 15, 'c': 11, 'e': 6}, 'e': {'d': 6, 'f': 9}}

到目前为止,这就是我所拥有的,但它只是删除了第一个b,这是一个密钥,我如何访问嵌套字典中的b

n = "b"
del dic[n]
print(dic)

每当我做这样的事情:

dic = {'b': {'a': 7, 'c': 10, 'd': 15}, 'a': {'b': 7, 'c': 9, 'f': 14}, 'c': {'a': 9, 'b': 10, 'd': 11, 'f': 2}, 'f': {'a': 14, 'c': 2, 'e': 9}, 'd': {'b': 15, 'c': 11, 'e': 6}, 'e': {'d': 6, 'f': 9}}

每当我做这样的事情:

n = "b"
for k in dic.keys():
if k == n:
del dic[k]

终端中出现RuntimeError:字典在迭代期间更改了大小

您可以编写一个递归函数:

def delete_key(k, dic):
if k in dic:
del dic[k]
for val in dic.values():
if isinstance(val, dict):
delete_key(k, val)
return dic
d = {'b': {'a': 7, 'c': 10, 'd': 15}, 'a': {'b': 7, 'c': 9, 'f': 14}, 'c': {'a': 9, 'b': 10, 'd': 11, 'f': 2}, 'f': {'a': 14, 'c': 2, 'e': 9}, 'd': {'b': 15, 'c': 11, 'e': 6}, 'e': {'d': 6, 'f': 9}}
delete_key('b', d)
{'a': {'c': 9, 'f': 14},
'c': {'a': 9, 'd': 11, 'f': 2},
'd': {'c': 11, 'e': 6},
'e': {'d': 6, 'f': 9},
'f': {'a': 14, 'c': 2, 'e': 9}}

假设您想将字典转换为矩阵,可以按如下方式执行:

from sklearn.feature_extraction import DictVectorizer
dictionary = {
'b': {'a': 7, 'c': 10, 'd': 15},
'a': {'b': 7, 'c': 9, 'f': 14},
'c': {'a': 9, 'b': 10, 'd': 11, 'f': 2},
'f': {'a': 14, 'c': 2, 'e': 9},
'd': {'b': 15, 'c': 11, 'e': 6},
'e': {'d': 6, 'f': 9}
}

keys_removed = [dictionary.get(i) for i in dictionary]
dictvectorizer = DictVectorizer(sparse=False)
matrix = dictvectorizer.fit_transform(keys_removed)

这将提供以下输出:

[[ 7.  0. 10. 15.  0.  0.]
[ 0.  7.  9.  0.  0. 14.]
[ 9. 10.  0. 11.  0.  2.]
[14.  0.  2.  0.  9.  0.]
[ 0. 15. 11.  0.  6.  0.]
[ 0.  0.  0.  6.  0.  9.]]

矩阵索引对应于内部键值(a到f(,这就是为什么在特定键处不存在值的情况下,矩阵具有零。

或者,如果你只想去掉主键,你只需要使用keys_removed = [dictionary.get(i) for i in dictionary]并从列表中转换它。这将为您提供以下内容:

[{'a': 7, 'c': 10, 'd': 15}, {'b': 7, 'c': 9, 'f': 14}, {'a': 9, 'b': 10, 'd': 11, 'f': 2}, {'a': 14, 'c': 2, 'e': 9}, {'b': 15, 'c': 11, 'e': 6}, {'d': 6, 'f': 9}]

编辑

如果你想删除某些密钥及其相应的条目,你可以这样做:

def delete_key(keys: list):
dictionary = {
'b': {'a': 7, 'c': 10, 'd': 15},
'a': {'b': 7, 'c': 9, 'f': 14},
'c': {'a': 9, 'b': 10, 'd': 11, 'f': 2},
'f': {'a': 14, 'c': 2, 'e': 9},
'd': {'b': 15, 'c': 11, 'e': 6},
'e': {'d': 6, 'f': 9}
}

for i in keys:
dictionary.pop(i)

return dictionary

print (delete_key(keys=['a', 'c']))

这会获取一个要删除的键列表,并返回一个没有这些键的新字典。以上案例输出:

{'b': {'a': 7, 'c': 10, 'd': 15}, 'f': {'a': 14, 'c': 2, 'e': 9}, 'd': {'b': 15, 'c': 11, 'e': 6}, 'e': {'d': 6, 'f': 9}}

根据您最近的澄清,这应该有效:

def delete_key(outer_keys: list, inner_keys: list):
dictionary = {
'b': {'a': 7, 'c': 10, 'd': 15},
'a': {'b': 7, 'c': 9, 'f': 14},
'c': {'a': 9, 'b': 10, 'd': 11, 'f': 2},
'f': {'a': 14, 'c': 2, 'e': 9},
'd': {'b': 15, 'c': 11, 'e': 6},
'e': {'d': 6, 'f': 9}
}

for i in outer_keys:
dictionary.pop(i)

for i in dictionary:
for j in inner_keys:
if j in dictionary[i]:
dictionary[i].pop(j)

return dictionary

print (delete_key(outer_keys=[], inner_keys=['a']))

功能如下:

  • 它允许您指定要删除的键(以及相应的条目(。您只需在outer_keysinner_keys中列出哪一个,后者是嵌套字典中最深的键
  • 这些必须定义为键名列表,如果您只想从内部或外部删除键,则可以为空

以上示例将输出以下内容:

{'b': {'c': 10, 'd': 15}, 'a': {'b': 7, 'c': 9, 'f': 14}, 'c': {'b': 10, 'd': 11, 'f': 2}, 'f': {'c': 2, 'e': 9}, 'd': {'b': 15, 'c': 11, 'e': 6}, 'e': {'d': 6, 'f': 9}}

您会注意到所有内部的"a"键都已被删除。操作可以使用更少的循环来完成,但这应该足够好地说明这个过程。

最新更新