2017-11-18 134 views
0

我有一本字典如何删除字典中的字典的键值对?

dicto = {12:{34:45,56:78},45:{67:23,90:15}} 

我想删除一个键值对说dictionary.How的关键4567:23做呢?

这是我做的,到目前为止,但我得到的错误

dicto = {12:{34:45,56:78},45:{67:23,90:15}} 
for k,v in dicto.items(): 
    for i in v.keys(): 
     if i == 67: 
      del v[i] 

print(dicto) 

,我得到的是

Traceback (most recent call last): 
    File "/home/souvik/Sublime-text programs/TestCode.py", line 4, in <module> 
    for i in v.keys(): 
RuntimeError: dictionary changed size during iteration 
[Finished in 0.1s with exit code 1] 

如何删除特定的键值对的错误?

+0

@PatrickArtner在这里我有一本词典里面的字典,所以我无法应用正常的删除方法 –

+0

你可以使用pop() - 查看答案。您将从所有内部字符中删除密钥,因为您遍历所有内部字符。 –

回答

2

或更贴近你做了什么,并删除所有内部字典的键67,而无需知道theire键以及:

会为蟒蛇2.7

dicto = {12:{34:45,56:78},45:{67:23,90:15}} 
print "" 
for k,v in dicto.items(): 
    for i in v.items(): 
     if (i[0] == 67): 
       v.pop(i[0]) 
print(dicto) 
工作

输出:

{12: {56: 78, 34: 45}, 45: {90: 15}} 

而不是修改英一些元素告诉你正确的字典内从自身删除其键/值对

此代码将删除从所有内部字典的关键``67`:

dicto = {12:{34:45,56:78},45:{67:23,90:15},99:{67:1,88:5}} 

会导致

{99: {88: 5}, 12: {56: 78, 34: 45}, 45: {90: 15}} 

编辑: 作为Souvik雷伊指出,3.6这不会工作(与pyfiddle测试它为2.7,其中它的工作原理)

将与3.6

dicto = {12:{34:45,56:78},45:{67:23,90:15},99:{67:1,88:5}} 
print ("") 
dictsToRemoveKeysFrom = [] 
for k,v in dicto.items(): 
    print (v) 
    for i in v.items(): 
     if (i[0] == 67): 
       dictsToRemoveKeysFrom.append(v) 

for d in dictsToRemoveKeysFrom: 
    d.pop(67) 

print(dicto) 

你得到的错误工作,因为你改变dictionarys在遍历theire父。只需记住之后修改和修改的字典。

+1

首先你错过了.items()给出了两个迭代器,所以它会抛出一个错误,该对象不是可以下标的,因为我是一个int,并且你正试图访问我[0] –

+0

@SouvikRay对不起,我的www.pyfiddle .io坐在Python 2.7上,在这里工作。第二版将适用于3.6。 –

+0

@SouvikRay'items()'会给出2个项目,但是如果我像这里一样使用它,'i'将会是一个元组,我可以通过'i [0]'来访问它,没问题。为了避免错误,只需记住字典修改和修改他们的迭代 –

0

这是simplyer,因为它看起来,没有找到需要的:

del k[45][63] 
+0

为此,你需要知道45 - 但他的解决方案将从任何内部字典中删除此密钥,不是吗? –

1

似乎很简单。

>>> dicto = {12:{34:45,56:78},45:{67:23,90:15}} 
>>> dicto 
{12: {34: 45, 56: 78}, 45: {67: 23, 90: 15}} 
>>> del dicto[45][67] 
>>> dicto 
{12: {34: 45, 56: 78}, 45: {90: 15}} 
+0

为此,你需要知道45,但他的解决方案将从任何内部字典中删除此密钥,不是吗? –