如何从嵌套字典中移除reason值为'sold'的条目?错误代码修复
如何移除嵌套字典中'reason'为'sold'的条目?
嘿,我来帮你搞定这个问题!你的需求是移除嵌套字典中所有reason为sold的条目,但代码里有几个小问题导致它跑不起来,咱们一步步来拆解:
你的代码存在的问题
咱们先看看你写的代码:
for k, v in book: if v == 'sold': del book[k]
这里有三个关键错误:
- 遍历方式错误:直接
for k, v in book会遍历字典的键(比如20、21),每次迭代只能拿到一个值,没法解包成k和v,会直接触发ValueError。要同时获取键和值,得用book.items()。 - 判断条件错误:
v == 'sold'里的v是子字典(比如{'start':'2008','reason':'sold'}),你需要取子字典里的reason字段来判断,也就是v['reason'] == 'sold'。 - 遍历中修改字典的风险:直接在遍历原字典的过程中删除元素,会导致字典的大小在遍历期间改变,触发
RuntimeError。
正确的解法
方法1:用字典推导式生成新字典(推荐)
这种方法简洁高效,而且不会修改原字典(如果需要保留原数据的话很合适),直接过滤掉不符合条件的条目:
book = {20:{'start':'2008','reason':'sold'}, 21:{'start':'2009','reason':'returned'}, 22:{'start':'2010','reason':'returned'}} # 过滤掉reason为sold的条目 book = {k: v for k, v in book.items() if v['reason'] != 'sold'} print(book)
运行后输出就是你想要的:
{21: {'start': '2009', 'reason': 'returned'}, 22: {'start': '2010', 'reason': 'returned'}}
方法2:原地修改原字典
如果你需要直接修改原字典而不是生成新的,可以遍历字典键的副本(比如list(book.keys())),这样遍历的是一个固定的键列表,删除原字典元素不会影响遍历过程:
book = {20:{'start':'2008','reason':'sold'}, 21:{'start':'2009','reason':'returned'}, 22:{'start':'2010','reason':'returned'}} # 遍历键的副本 for k in list(book.keys()): if book[k]['reason'] == 'sold': del book[k] print(book)
这个方法同样能得到你期望的结果。
内容的提问来源于stack exchange,提问作者user9831231
相关产品推荐
相关产品推荐

