You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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。

正确实现方式

根据需求的输出格式,有几种常见的正确写法:

  1. 返回元组列表
    如果希望新列表的元素是包含name和group的元组:
availability_list = [(obj["name"], obj["group"]) for obj in my_list if "Morning" in obj["availability"]]

执行结果:[('A', 'Upper'), ('C', 'Lower')]

  1. 返回字典列表
    如果需要保留键值对结构,返回由新字典组成的列表:
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"}
]
  1. 普通循环实现
    如果觉得列表推导式不够直观,也可以用常规循环分步处理:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 12:15:25