Python3如何使用filter()删除字典值列表内符合条件的子列表
代码实现方案
先定义可灵活修改的匹配参数:
# 可自定义的匹配参数 TARGET_KEY = "A" # 要处理的字典键 CHECK_INDEX = 2 # 子列表要校验的索引位置 EXCLUDE_VAL = 3242413 # 要删除的子列表对应索引的目标值
1. 字典推导式实现(更推荐,可读性更高)
原有写法的误区是把过滤条件放在了字典键值对的判断逻辑里,实际上我们不需要删除整个键值对,只需要对指定键对应的值列表做子元素过滤即可:
new_dict = { key: [sublist for sublist in value if not (key == TARGET_KEY and sublist[CHECK_INDEX] == EXCLUDE_VAL)] for key, value in d.items() }
逻辑说明:如果当前遍历的键不是目标键,key == TARGET_KEY为假,过滤条件恒成立,对应值列表完全保留;如果是目标键,则仅保留指定索引位置不等于排除值的子列表。
2. filter函数实现
filter本身是对可迭代对象的元素做筛选,要实现字典的整体转换,需要搭配map先对每个键值对的值做过滤处理:
new_dict = dict( map( lambda elem: ( elem[0], list(filter(lambda sub: not (elem[0] == TARGET_KEY and sub[CHECK_INDEX] == EXCLUDE_VAL), elem[1])) ), d.items() ) )
3. 原地修改简化方案
如果你不需要保留原字典,直接修改原对象的话可以一行完成,不需要生成新字典:
d[TARGET_KEY] = [s for s in d[TARGET_KEY] if s[CHECK_INDEX] != EXCLUDE_VAL]
使用你给出的示例字典运行以上任意方案后,d["A"]的输出结果即为期望的[[0, "APPLE", 1202021, "NEW"], [1982, "PEAR", 1299021, "OLD"]]。
内容的提问来源于stack exchange,提问作者demid
相关产品推荐
相关产品推荐

