被 dict 字典取值逼着进阶

那些年遇到的取数场景

目标1:取AA的值(第1层数据):

参数正常返回:

dic = {"AA": {"BB": {"CC": 666}}}

dic["AA"] -- 够用😀

参数未正常返回:

dic = {"AAA": {"BB": {"CC": 666}}}

dic["AA"] -- 找不到报错:KeyError: 'AA' ---淘汰❌

dic.get("AA") -- 找不到返回None,新欢✅

目标2:取BB的值(第2层数据)

第1层数据正常返回:

dic = {"AA": {"BB": {"CC": 666}}}

dic.get("AA").get("BB") -- 够用😀

第1层数据未正常返回:

dic = {"AAA": {"BB": {"CC": 666}}}

dic.get("AA").get("BB") -- 找不到报错:AttributeError: 'NoneType' object has no attribute 'get' ---淘汰❌

jmespath.search("AA.BB", dic) -- 表达式查询,查不到就返回None,妈妈再也不用担心我取值报错啦💃🏿💃🏿

上干货⬇️⬇️⬇️⬇️⬇️⬇️⬇️

1. jmespath 三方依赖包安装

pip install jmespath

2. jmespath使用语法

jmespath.search("AA.BB", dic)

jmespath.search("*.BB", dic)

AA.BB -- 表达式

dic -- 变量名

一般的取数用A.B.C、*.C就足够了,如果你还想进阶的话!! ⬇️⬇️⬇️⬇️⬇️

3. 表达式支持的操作符:

  1. 点操作符(.): 用于访问JSON对象中的属性或数组中的元素。
  2. 方括号操作符([]): 用于访问JSON数组中的元素,可以使用索引、迭代和过滤数组。
  3. 通配符(*)和多级通配符(**): 用于匹配任意层级的属性或数组元素。
  4. 过滤器(?): 用于根据条件过滤数组元素。
  5. 比较操作符: 支持等于(==)、不等于(!=)、小于(<)、小于等于(<=)、大于(>)和大于等于(>=)等比较操作符。
  6. 逻辑操作符: 支持与(and)、或(or)和非(not)等逻辑操作符。
dic = {
  "students": [
    {
      "name": "Alice",
      "age": 18,
      "grades": {
        "math": 90,
        "english": 85,
        "science": 92
      }
    },
    {
      "name": "Bob",
      "age": 20,
      "grades": {
        "math": 75,
        "english": 88,
        "science": 80
      }
    },
    {
      "name": "Charlie",
      "age": 19,
      "grades": {
        "math": 85,
        "english": 92,
        "science": 78
      }
    }
  ]
}

1.提取所有学生的名字和年龄:

students[].{ "name": name, "age": age }

2.提取分数大于90分的学生姓名:

students[?grades.math > 90].name

3.提取所有学生的平均分数:

students[].{ "name": name, "average_grade": (grades.math + grades.english + grades.science) / 3}

4.提取平均分数最高的学生姓名:

students[].{"name": name, "average_grade": (grades.math + grades.english + grades.science) / 3} | max_by(@, &average_grade).name

5.提取每个科目的最高分数:

{"math": max(students[].grades.math),"english": max(students[].grades.english),"science": max(students[].grades.science)}

6.提取年龄在18到20之间的学生姓名:

students[age >= 18 && age <= 20].name

  • Python
    101 引用 • 234 回帖 • 1 关注
1 操作
KID 在 2024-04-10 13:40:20 更新了该帖
回帖
请输入回帖内容 ...