我知道如何使用.get()从json安全地获取密钥

data = {"person": {"name": "chris", "age": 11, "interests": []}}

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

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

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

如果列表索引不存在,我如何假设它存在并安全地继续?

显然,我可以在try 获取索引之前try 获取列表并判断其长度,但是没有更干净的方法吗?

克里斯

推荐答案

你可以使用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块try 匹配包含键"person""interests"的嵌套字典,然后如果"interests"键具有索引为3的对应列表,则提供匹配.

在上面的示例中,不会打印任何内容,因为"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 {}

Python相关问答推荐

使用scipy. optimate.least_squares()用可变数量的参数匹配两条曲线

如何使用scipy从频谱图中回归多个高斯峰?

pandas DataFrame GroupBy.diff函数的意外输出

DataFrame groupby函数从列返回数组而不是值

删除最后一个pip安装的包

运行Python脚本时,用作命令行参数的SON文本

更改键盘按钮进入'

根据二元组列表在pandas中创建新列

如何在给定的条件下使numpy数组的计算速度最快?

在Python中动态计算范围

梯度下降:简化要素集的运行时间比原始要素集长

部分视图的DataFrame

python中的解释会在后台调用函数吗?

以逻辑方式获取自己的pyproject.toml依赖项

巨 Python :逆向猜谜游戏

Discord.py -

BeautifulSoup:超过24个字符(从a到z)的迭代失败:降低了首次深入了解数据集的复杂性:

什么是一种快速而优雅的方式来转换一个包含一串重复的列,而不对同一个值多次运行转换,

我怎样才能让深度测试在OpenGL中使用Python和PyGame呢?

为什么在更新Pandas 2.x中的列时,数据类型不会更改,而在Pandas 1.x中会更改?