Python:筛选对象列表中含指定值的元素并提取多字段及KeyError解决
问题描述
我尝试基于对象列表中的特定项填充新列表,但找不到正确语法遍历对象列表,判断对象中子列表是否包含特定值。
我的对象列表如下:
my_list = [ { "name": "A", "group": "Upper", "availability": [ "Morning", "Afternoon", "Evening", "Night" ] }, { "name": "B", "group": "Upper", "availability": [ "Evening", "Night" ] }, { "name": "C", "group": "Lower", "availability": [ "Morning" ] } ]
我希望将所有"availability"列表包含"Morning"的对象的name和group字段填充到新列表中。
我查阅了多种列表填充方法,但未找到针对「列表中对象的子列表是否包含特定项」的筛选填充方式。
!编辑补充!
我尝试使用列表推导式的方案,原本似乎可行,但当尝试同时提取name和group字段时:
availability_list = [obj["name", "group"] for obj in my_list if "Morning" in obj["availability"]]
出现如下错误:
Exception has occurred: KeyError ('name', 'group')
解决方案
错误原因
obj["name", "group"]的写法不符合Python字典的取值规则——字典的键只能是单个独立值,这里的("name", "group")是一个元组,而你的字典中并没有这个元组对应的键,因此触发了KeyError。
正确实现方式
根据需求的输出格式,有几种常见的正确写法:
- 返回元组列表
如果希望新列表的元素是包含name和group的元组:
availability_list = [(obj["name"], obj["group"]) for obj in my_list if "Morning" in obj["availability"]]
执行结果:[('A', 'Upper'), ('C', 'Lower')]
- 返回字典列表
如果需要保留键值对结构,返回由新字典组成的列表:
availability_list = [{"name": obj["name"], "group": obj["group"]} for obj in my_list if "Morning" in obj["availability"]]
执行结果:
[ {"name": "A", "group": "Upper"}, {"name": "C", "group": "Lower"} ]
- 普通循环实现
如果觉得列表推导式不够直观,也可以用常规循环分步处理:
availability_list = [] for obj in my_list: if "Morning" in obj["availability"]: # 选择元组格式添加 availability_list.append( (obj["name"], obj["group"]) ) # 或选择字典格式添加 # availability_list.append( {"name": obj["name"], "group": obj["group"]} )
内容的提问来源于stack exchange,提问作者Moonlyte Demon
相关产品推荐
相关产品推荐

