Python 是否从嵌套字典中删除键和值?

Python 是否从嵌套字典中删除键和值?,python,dictionary,nested,Python,Dictionary,Nested,我有这样一个嵌套字典: book={20:{'start':'2008','reason':'sold'}, 21:{'start':'2009','reason':'returned'}, 22:{'start':'2010','reason':'returned'}} book={21:{'start':'2009','reason':'returned'}, 22:{'start':'2010','reason':'returned'}} 我想删除“

我有这样一个嵌套字典:

book={20:{'start':'2008','reason':'sold'},
      21:{'start':'2009','reason':'returned'},
      22:{'start':'2010','reason':'returned'}}
book={21:{'start':'2009','reason':'returned'},
      22:{'start':'2010','reason':'returned'}}
我想删除“原因”==“售出”的项目

输出应如下所示:

book={20:{'start':'2008','reason':'sold'},
      21:{'start':'2009','reason':'returned'},
      22:{'start':'2010','reason':'returned'}}
book={21:{'start':'2009','reason':'returned'},
      22:{'start':'2010','reason':'returned'}}
这是我不工作的代码:

for k, v in book:
   if v == 'sold':
       del book[k] 

您可以使用字典理解:

book={20:{'start':'2008','reason':'sold'},
  21:{'start':'2009','reason':'returned'},
  22:{'start':'2010','reason':'returned'}}
new_book = {a:b for a, b in book.items() if b['reason'] != 'sold'}
输出:

{21: {'start': '2009', 'reason': 'returned'}, 22: {'start': '2010', 'reason': 'returned'}}
{21: {'start': '2009', 'reason': 'returned'}, 22: {'start': '2010', 'reason': 'returned'}}

这就完成了一些调试工作

booko = book.copy()
for k in book:
   print('k', k)
   if 'reason' in book[k] and book[k]['reason'] == 'sold':
       print(book[k]['reason'])
       del booko[k]
print booko
book=booko
复制了原始内容,因为否则迭代器不知道下一步是什么

字典理解很酷,但对格罗克来说却非常怪异。我喜欢循环的可维护性。在学习过程中,您还可以执行print语句来查看实际情况。

尝试以下操作:

dictionary = {}
book={20:{'start':'2008','reason':'sold'},
      21:{'start':'2009','reason':'returned'},
      22:{'start':'2010','reason':'returned'}}
for d in book:
   if book[d]['reason'] != 'sold':
      dictionary[d] = book[d]
   else:
      pass
print(dictionary)
输出:

{21: {'start': '2009', 'reason': 'returned'}, 22: {'start': '2010', 'reason': 'returned'}}
{21: {'start': '2009', 'reason': 'returned'}, 22: {'start': '2010', 'reason': 'returned'}}

我通过图书词典进行迭代,然后检查词典的
'reason'
列是否为
'sell'
,如果是,则通过,如果不是,则将其添加到新词典中

1。发生了什么事?2.尝试打印“book[k]”,而不是尝试删除它。打印什么?谢谢你的回答。我收到以下错误:“KeyError:”原因“”@乔纳森:现在就开始。似乎你没有在所有的字典里都有“原因”键。太好了!是的,我在所有的口述中都没有“理由”。我没注意到。非常感谢你。