如何用点符号和方括号字符串键访问嵌套字典/列表结构
解决方案
要实现直接通过带点符号和数组下标的字符串键访问嵌套字典(含数组)的值,我们可以通过解析键路径+逐层访问的方式实现,无需转换原字典结构。
步骤说明
- 解析键路径:把类似
g[0].h的字符串拆分为可识别的访问步骤(如["g", 0, "h"]),区分字典键(字符串)和数组下标(整数)。 - 逐层访问嵌套结构:遍历解析后的路径,依次访问字典的键或数组的下标,最终拿到目标值。
代码实现
import re def parse_key_path(key_path): # 匹配字典键和数组下标,比如"g[0].h"会拆成[("g", "0"), ("h", None)] pattern = re.compile(r'(\w+)(?:\[(\d+)\])?') parts = pattern.findall(key_path) # 把数组下标转为整数,字典键保留字符串 return [int(idx) if idx else key for key, idx in parts] def get_nested_value(data, key_path): path_parts = parse_key_path(key_path) current = data for part in path_parts: try: current = current[part] except (KeyError, IndexError, TypeError): # 路径不存在时返回None,也可以改为抛出异常 return None return current # 测试用的嵌套字典 data = { "a": 1, "b": 2, "c": 3, "d": { "e": 4, "f": 5 }, "g": [ {"h": 6, "i": 7}, {"h": 8, "i": 9} ] } # 测试案例 print(get_nested_value(data, "d.e")) # 输出: 4 print(get_nested_value(data, "g[0].h")) # 输出: 6 print(get_nested_value(data, "g[1].i")) # 输出: 9 print(get_nested_value(data, "g[2].h")) # 输出: None(下标越界)
代码解释
parse_key_path:用正则表达式拆分键路径,将数组下标从字符串转为整数,确保后续能正确访问数组。get_nested_value:遍历解析后的路径,逐层访问数据结构;遇到路径不存在的情况(比如键不存在、数组下标越界),返回None,你也可以根据需求修改为抛出KeyError或IndexError。
内容的提问来源于stack exchange,提问作者RoyalSwish
相关产品推荐
相关产品推荐

