从 json 安全获取嵌套列表索引?

Safely get nested list index from json?

我知道如何使用 .get()

从 json 安全地获取密钥
data = {"person": {"name": "chris", "age": 11, "interests": []}}

data.get("person", {}).get("height") 只会 return None

但是如果我想对列表做同样的事情呢?

data.get("person", {}).get("interests", []).get([3], {}).get("someotherdata")

我如何假定列表索引存在并在不存在时安全地继续?

显然我可以尝试获取列表并在尝试获取索引之前检查其长度,但是有没有更简洁的方法?

克里斯

您可以使用 match-case:

data = {"person": {"name": "chris", "age": 11, "interests": []}}
match data:
   case {"person": {"interests": [_, _, _, val, *_]}}:
      print(val)
   case _: #default case, only executes no match is made
      pass

此处,case 块尝试匹配包含键 "person""interests" 的嵌套字典,然后如果 "interests" 键具有索引为三的对应列表。

在上面的示例中,不会打印任何内容,因为 "interests" 的列表值为空。但是,如果 "interests" 的索引为 3,则将打印 4

data = {"person": {"name": "chris", "age": 11, "interests": [1, 2, 3, 4]}}
match data:
  case {"person": {"interests": [_, _, _, val, *_]}}:
     print(val)
  case _:
     pass

输出:

4

编辑:纯内联解决方案:

r = v[3] if len(v:=data.get('person', {}).get('interests', [])) > 3 else {}