python filter可变过滤条件过滤json列表

本文介绍了如何通过编写filter_by函数来简化从JSON列表中筛选数据的过程。通过使用默认参数和**kwargs,可以灵活地根据不同的属性进行过滤,避免了编写大量if条件。示例中展示了如何找出学校为THU的所有学生,同时讨论了两种实现方式的优缺点:一种是明确列出参数,另一种是使用参数列表。这种方式对于处理大量属性的JSON数据非常有用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

场景是这样的,假设有一个json用来表示一个学生的信息:

{
	"name" : "name",
	"age" : "age",
	"clazz" : "class",
	"school" : "school",
}

某次查询返回来的是一个josn列表 [{},{},{}…],而我需要对这些列表做一些过滤的操作。
类似找出所有 name=‘小明’ 的 json, 或者过找出所有 age=19 并且 class=三年级 的学生。

直接使用if枚举状态太多,有 n 个属性就要写 2 n 2^n 2n 个条件。所以想有没有更简单的写法。
一种想法是,写一个 filter_by 函数,默认全为None,此时不做任何过滤,仅有那些被赋值的参数才会作为过滤条件。
比如要找THU毕业的所有学生:

def filter_by(stu_info, clazz=None, name=None, age=None, school=None):
    params = locals()
    params.pop('stu_info')
    for key in params:
        if params[key] is None:
            continue
        if stu_info.get(key) != params[key]:
            return False
    return True

if __name__ == "__main__":
    json_list = [
        {
            "clazz": "三年级",
            "name": "小明",
            "age": 13,
            "school": "THU"
        },
        {
            "clazz": "五年级",
            "name": "小明",
            "age": 21,
            "school": "THU"
        },
        {
            "clazz": "七年级",
            "name": "小红",
            "age": 12,
            "school": "PKU"
        },
    ]
    filtered_list = list(filter(lambda x: filter_by(x, school="THU"), json_list))
    print(filtered_list)

结果:

[{'clazz': '三年级', 'name': '小明', 'age': 13, 'school': 'THU'}, 
 {'clazz': '五年级', 'name': '小明', 'age': 21, 'school': 'THU'}]

如果 json 属性非常多,那么可以使用参数列表来处理,修改 filter_by 函数:

def filter_by(stu_info, **kwargs):
    params = kwargs
    for key in params:
        if stu_info.get(key) != params[key]:
            return False
    return True

同样的使用方式:

  filtered_list = list(filter(lambda x: filter_by(x, school="THU"), json_list))
   print(filtered_list)

结果相同。

相比之下第二种方式更为灵活一些,但是需要对应对 json 结构比较了解,不然可能会写出实际不存在的一些参数。
第一种方式需要明确写出有那些参数,但是好处是如果传入不存在的参数解释器会有提醒。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值