【问题标题】:Remove key and value from nested dictionaries?从嵌套字典中删除键和值?
【发布时间】:2018-05-22 23:10:04
【问题描述】:

我有一个这样的嵌套字典:

book={20:{'start':'2008','reason':'sold'},
      21:{'start':'2009','reason':'returned'},
      22:{'start':'2010','reason':'returned'}}

我想删除 'reason'== 'sold' 的商品。

输出应该是这样的:

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

这是我的代码不起作用:

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

【问题讨论】:

  • 1.会发生什么? 2. 尝试打印“book[k]”而不是尝试删除它。打印什么?

标签: python dictionary nested


【解决方案1】:

您可以使用字典理解:

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'}}

【讨论】:

    【解决方案2】:

    这可以完成一些调试工作。

    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
    

    复制原件,否则迭代器不知道接下来会发生什么......

    dictionary comprehension 很酷,但摸起来超级奇怪。我喜欢循环的可维护性。此外,在您学习的过程中,您可以执行打印语句来查看实际发生的情况。

    【讨论】:

    • 感谢您的回答。我收到此错误: 'KeyError: 'reason'' 。 @乔纳森
    • 现在就试试吧。似乎您在所有字典中都没有“原因”键。
    • 完美!是的,我在所有的听写中都没有“理由”。我没有注意到这一点。非常感谢。
    【解决方案3】:

    试试这个:

    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'}}
    

    我遍历书籍字典,然后检查字典的'reason' 列是否为'sold',如果是,则通过,如果不将其添加到新字典中

    【讨论】:

      猜你喜欢
      • 2017-03-08
      • 2019-11-18
      • 2014-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多