修复查找拥有指定爱好人员的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
相关产品推荐
相关产品推荐

