Python3中如何删除嵌套列表内指定条件的整个字典元素?
问题:如何彻底删除列表中符合条件的字典元素?
这个问题我之前处理类似嵌套数据结构时也碰到过,直接操作很容易踩坑,咱们一步步拆解解决:
原始数据结构
首先看你给出的原始数据:
{ 'result': { 'result': [ { 'Company': {'PostAddress': None}, 'ExternalPartnerProperties': None, 'Id': 123456, 'Level': 'Level1', 'Name': 'Name1', 'ParentId': 456789, 'State': 'InTrial', 'TrialExpirationTime': 1435431669 }, { 'Company': {'PostAddress': None}, 'ExternalPartnerProperties': None, 'Id': 575155, 'Level': 'Level2', 'Name': 'Name2', 'ParentId': 456789, 'State': 'InTrial', 'TrialExpirationTime': 1491590226 }, { 'Company': {'PostAddress': None}, 'ExternalPartnerProperties': None, 'Id': 888888, 'Level': 'Level2', 'Name': 'Name3', 'ParentId': 456789, 'State': 'InProduction', 'TrialExpirationTime': 1493280310 } ] } }
初始尝试的问题
你最开始的代码只是清空了符合条件的字典内容,但没有把这个空字典从列表里移除,所以列表长度还是3:
for i in partner_output['result']['result']: if "InProduction" in i['State']: del i['Company'], i['ExternalPartnerProperties'], i['Id'], i['Level'], i['Name'], i['ParentId'], i['State'], i['TrialExpirationTime']
执行后得到的结果里第三个元素是空字典,达不到彻底移除的效果。
错误原因分析
后来你尝试用del partner_output['result'][i]报错TypeError: unhashable type: 'dict',主要有两个原因:
partner_output['result']是一个字典,它的key是'result',你不能用字典(i是列表里的字典元素)作为key去删除字典内容;- 就算你定位到了正确的列表(
partner_output['result']['result']),正序遍历列表时直接删除元素,会导致索引混乱,容易出现漏删或者索引越界的问题。
正确解决方案
这里有两种实用的解决方法:
方法1:列表推导式创建新列表(推荐,简洁安全)
直接筛选出不需要删除的元素,重新赋值给原列表,这样就彻底移除了符合条件的元素:
# 保留State不等于InProduction的所有元素 partner_output['result']['result'] = [ item for item in partner_output['result']['result'] if item['State'] != 'InProduction' ]
处理后,原列表就只剩下两个State为InTrial的字典元素,完美解决问题。
方法2:倒序遍历索引删除元素
如果不想创建新列表,也可以倒序遍历列表的索引,这样删除元素不会影响前面元素的索引位置:
# 先把目标列表取出来,方便操作 results_list = partner_output['result']['result'] # 从最后一个元素的索引开始,往前遍历 for idx in range(len(results_list)-1, -1, -1): if results_list[idx]['State'] == 'InProduction': del results_list[idx]
倒序遍历的好处是,删除后面的元素时,前面的元素索引不会改变,不会出现漏删或者索引越界的情况。
内容的提问来源于stack exchange,提问作者Ecaz
相关产品推荐
相关产品推荐

