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

修复查找拥有指定爱好人员的Python函数问题

修复:找出拥有指定爱好之一的人员集合

我需要编写一个函数,找出所有至少拥有给定爱好之一的不同人员,返回这些人员姓名的集合。已将输入字符串转换为{姓名: [爱好1, 爱好2,...]}形式的字典后,编写了如下代码:

def find_people_with_hobbies(data: str, hobbies: list) -> set:
    new_dict = create_dictionary(data) # 创建{name1: [hobby1, hobby2, ...], name2: [...]}形式的字典
    return set([k for k, v in new_dict.items() if v == hobbies])

给定测试数据:

  • data="John:running\nMary:running\nJohn:dancing\nJack:dancing\nJack:painting\nSmith:painting"
  • hobbies=["running", "dancing"]

预期结果应为{"John", "Mary", "Jack"},但当前代码仅能找到Jack,需要改进函数。


问题分析

原代码的核心错误在于判断条件v == hobbies:这要求用户的爱好列表完全匹配给定的hobbies列表(内容、顺序都必须一致),但实际需求是用户只要拥有至少一个指定爱好即可。比如:

  • Mary的爱好是["running"],显然不等于["running", "dancing"],会被过滤;
  • John的爱好如果被create_dictionary处理成["dancing", "running"](顺序不同),也会因为不相等被排除;
  • 只有Jack的爱好列表恰好和hobbies完全一致时才会被选中,这和需求不符。

修复方案

修改判断逻辑,检查用户爱好列表与指定爱好列表是否存在交集(即至少有一个共同爱好),有两种常用实现方式:

方式1:利用集合交集判断(效率更高)

将爱好列表转成集合,通过集合交集是否为空来判断,适合爱好数量较多的场景:

def find_people_with_hobbies(data: str, hobbies: list) -> set:
    new_dict = create_dictionary(data)
    target_hobbies = set(hobbies)
    return {k for k, v in new_dict.items() if set(v) & target_hobbies}

方式2:使用any函数遍历判断(逻辑更直观)

逐个检查指定爱好是否存在于用户的爱好列表中,适合爱好数量较少的场景:

def find_people_with_hobbies(data: str, hobbies: list) -> set:
    new_dict = create_dictionary(data)
    return {k for k, v in new_dict.items() if any(h in v for h in hobbies)}

两种方式都能正确得到预期结果{"John", "Mary", "Jack"}。

内容的提问来源于stack exchange,提问作者QLimbo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 22:35:21