Python如何从嵌套混合结构列表中按键名提取字典字段值
核心问题原因
你当前遇到的访问失败是两个基础操作问题叠加导致的:
- 你把整个混合了列表、字典、零散基础值的外层列表赋值给了变量
dict,此时这个变量指向的是列表对象,而非字典,列表本身没有实现.get()方法,直接调用dict.get('duration')必然触发AttributeError类型错误 - 你拿到的不是单一字典结构,是嵌套层级混乱的混装列表,需要按层级拆解访问,不能跨层级直接取键值
现有结构拆解
基于你给出的列表内容,外层列表每个索引对应的存储内容是固定的:
- 索引0:嵌套列表,内部仅包含1个视频流信息字典,字典内直接存在
duration字段 - 索引1:格式元信息字典,字典内直接存在
duration字段 - 索引2及之后:零散的基础类型值(整数、浮点数、字符串、空字典),不存在字典结构,自然没有可访问的
duration键
具体访问方法
1. 精准定位取值(已知固定结构时使用)
因为结构层级固定,直接按索引层级取值即可:
- 取视频流信息中的duration值:
外层列表对象[0][0]['duration']- 取值逻辑:先取外层列表第0项(装着视频流信息的嵌套列表),再取嵌套列表第0项(视频流信息字典),最后按键名读取
duration对应的值
- 取值逻辑:先取外层列表第0项(装着视频流信息的嵌套列表),再取嵌套列表第0项(视频流信息字典),最后按键名读取
- 取格式元信息中的duration值:
外层列表对象[1]['duration']- 取值逻辑:直接取外层列表第1项(格式信息字典),按键名读取
duration对应的值
- 取值逻辑:直接取外层列表第1项(格式信息字典),按键名读取
2. 通用遍历取值(结构动态变化时使用)
如果后续嵌套结构有调整,不想手动逐个数索引位置,可以用递归遍历的方式自动找全所有duration对应的字段值,示例代码:
def find_all_key_values(target, target_key, collect_list=None): # 初始化收集列表,规避可变默认参数的隐性问题 if collect_list is None: collect_list = [] # 遇到字典结构先检查是否存在目标键 if isinstance(target, dict): if target_key in target: collect_list.append(target[target_key]) # 字典内的所有值继续递归查找 for value in target.values(): find_all_key_values(value, target_key, collect_list) # 遇到列表/元组结构逐元素递归查找 elif isinstance(target, (list, tuple)): for item in target: find_all_key_values(item, target_key, collect_list) return collect_list # 调用方式:把你转好的列表传进去,即可拿到所有匹配的duration值 all_duration_values = find_all_key_values(你的列表对象, 'duration')
额外注意事项
- 不要将变量命名为
dict,这会覆盖Python内置的字典类型,后续写代码容易出现难以排查的隐性问题,建议换成probe_info、video_meta这类表意明确的变量名 - 这个破碎的列表结构大概率是之前操作ffprobe返回值时,错误解包、把字段值强行拼接进列表导致的,如果要长期稳定访问字段,建议回到未被拆解的原始返回结构(通常是完整嵌套字典)上取值,不用硬对着拆分后的列表做索引匹配
内容的提问来源于stack exchange,提问作者Derek Edwards
相关产品推荐
相关产品推荐

