Python:如何用del、lambda从字典列表移除指定folder值的字典?
嘿,刚接触Python的话,这两种方法都很实用,我来给你一步步讲清楚~
方法1:使用
del语句移除元素 直接用del的话要注意一个坑:不能正向遍历列表删除元素,因为删除一个元素后,后面的元素会往前移动,导致后续的索引错位,有些元素会被跳过。所以我们要倒序遍历列表的索引来操作:
首先先定义你的原始数据和要移除的文件夹列表:
list_dict = [ {'children': [], 'folder': 'test2', 'parent': 'None'}, {'children': [{'children': [], 'folder': 'arun2', 'parent': 'arun2'}], 'folder': 'arun2', 'parent': 'None'}, {'children': [], 'folder': 'important', 'parent': 'None'}, {'children': [], 'folder': 'arun', 'parent': 'None'}, {'children': [], 'folder': 'hoi', 'parent': 'None'}, {'children': [], 'folder': 'drafts', 'parent': 'None'}, {'children': [], 'folder': 'Trash', 'parent': 'None'}, {'children': [], 'folder': 'sent', 'parent': 'None'}, {'children': [], 'folder': 'spam', 'parent': 'None'}, {'children': [], 'folder': 'reference', 'parent': 'None'}, {'children': [], 'folder': 'test3', 'parent': 'None'}, {'children': [], 'folder': 'test1', 'parent': 'None'}, {'children': [], 'folder': 'INBOX', 'parent': 'None'} ] remove_key_list = ['INBOX','sent','Trash']
然后执行倒序删除:
# 从最后一个元素的索引开始,往前遍历到0 for i in range(len(list_dict)-1, -1, -1): # 检查当前字典的folder是否在要移除的列表里 if list_dict[i]['folder'] in remove_key_list: del list_dict[i]
这样操作后,原list_dict就会直接移除掉目标元素啦。
方法2:使用
lambda结合filter函数 如果你不想修改原列表,而是生成一个新的处理后的列表,用lambda配合filter会更优雅:
# 用filter过滤出符合条件的元素,再转成列表 filtered_list = list(filter(lambda x: x['folder'] not in remove_key_list, list_dict))
这里的lambda x: x['folder'] not in remove_key_list是一个匿名函数,它会接收每个字典元素x,判断它的folder值是否不在要移除的列表里——如果是,就保留这个元素。filter函数会把所有符合条件的元素收集起来,最后用list()转成列表就是你要的结果。
另外补充个小知识点:Python里还有更简洁的列表推导式写法,效果和上面的filter+lambda一样,而且可读性更高,你也可以了解下:
filtered_list = [item for item in list_dict if item['folder'] not in remove_key_list]
内容的提问来源于stack exchange,提问作者Arun
相关产品推荐
相关产品推荐

