从 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 {}
我知道如何使用 .get()
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 {}