如何从字典列表中取值,不存在对应键时赋值为None?
解决嵌套字段/属性不存在时赋值为None的问题
根据你的需求,以下是几种针对不同数据结构的实现方案:
情况1:数据为字典结构(通过键访问)
如果packet[i]是字典,payload是字典键,time是子字典的键,可以用字典的get()方法链式处理:
# 直接链式调用get,不存在时自动返回None packet_time = packet[i].get("payload", {}).get("time")
- 原理:第一个
get("payload", {})如果找不到payload键,返回空字典;空字典调用get("time")时,默认返回None。
如果嵌套层级较多,可封装通用函数递归获取:
def get_nested_dict_value(data, key_chain, default=None): current = data for key in key_chain: if not isinstance(current, dict) or key not in current: return default current = current[key] return current # 使用示例:传入键的列表 packet_time = get_nested_dict_value(packet[i], ["payload", "time"])
情况2:数据为对象结构(通过属性访问)
如果packet[i]是类实例,payload是实例属性,time是payload的属性,用getattr()函数链式处理:
# 链式调用getattr,每一层不存在时返回None packet_time = getattr(getattr(packet[i], "payload", None), "time", None)
- 原理:第一个
getattr(..., "payload", None)如果找不到payload属性,返回None;对None调用getattr(..., "time", None)时,直接返回None。
同样可封装通用函数处理多层属性:
def get_nested_obj_attr(obj, attr_chain, default=None): current = obj for attr in attr_chain: try: current = getattr(current, attr) except AttributeError: return default if current is None: return default return current # 使用示例:传入属性名的列表 packet_time = get_nested_obj_attr(packet[i], ["payload", "time"])
混合结构(字典与对象嵌套)
如果嵌套结构中同时存在字典和对象,最简单的方式是用try-except捕获异常:
try: packet_time = packet[i].payload.time # 根据实际结构调整访问方式 except (AttributeError, KeyError): packet_time = None
这种方式直观简洁,适合嵌套层级较少的场景。
内容的提问来源于stack exchange,提问作者enim horsti
相关产品推荐
相关产品推荐

