如何用类或函数实现按运动、性别筛选并随机获取字典数据
实现支持运动和性别筛选的随机人员信息查询工具
我现有一段代码可实现输入指定运动后,筛选并随机获取对应人员的信息,但仅支持按运动筛选。希望同时支持按性别筛选(性别可留空表示无偏好),还尝试用类优化实现但代码存在问题,寻求帮助解决。
现有可运行代码(仅支持运动筛选)
import random # 人员信息字典 result = {'Peter': ['Male', 'Basketball'], 'Carlos': ['Male', 'Tennis'], 'Angela': ['Female', 'Golf'], 'David': ['Male', 'Basketball'], 'Kaitlin': ['Female', 'Golf'], 'Marco': ['Male', 'Tennis'], 'Andrew': ['Male', 'Golf'], 'Carmen': ['Female', 'Basketball']} # 输入目标运动 sportChoice = input("Enter desired sport workout: ") # 根据运动筛选数据 parsedData = [ '\n'.join([f"Name: {name}", f"Gender: {info[0]}", f"Sport: {info[1]}"]) for name, info in result.items() if info[1] == "{}".format(sportChoice) ] # 随机选取筛选后的人员 intList = [] for numbers in range(len(parsedData)): intList.append(numbers) print(intList) print(''.join(parsedData[int(random.choice(intList))]))
尝试添加性别筛选但未成功的代码
import random # 人员信息字典 result = {'Peter': ['Male', 'Basketball'], 'Carlos': ['Male', 'Tennis'], 'Angela': ['Female', 'Golf'], 'David': ['Male', 'Basketball'], 'Kaitlin': ['Female', 'Golf'], 'Marco': ['Male', 'Tennis'], 'Andrew': ['Male', 'Golf'], 'Carmen': ['Female', 'Basketball']} # 输入目标运动和性别 sportChoice = input("Enter desired sport workout: ") genderChoice = input("Enter desired Gender. If no preference, leave blank: ") # 处理性别空值(此处逻辑错误) if genderChoice == "": genderChoice == "Male" # 仅按运动筛选,未添加性别条件 parsedData = [ '\n'.join([f"Name: {name}", f"Gender: {info[0]}", f"Sport: {info[1]}"]) for name, info in result.items() if info[1] == "{}".format(sportChoice) ] # 随机选取筛选后的人员 intList = [] for numbers in range(len(parsedData)): intList.append(numbers) print(intList) print(''.join(parsedData[int(random.choice(intList))]))
尝试用类实现但存在问题的代码
result = {'Peter': ['Male', 'Basketball'], 'Carlos': ['Male', 'Tennis'], 'Angela': ['Female', 'Golf'], 'David': ['Male', 'Basketball'], 'Kaitlin': ['Female', 'Golf'], 'Marco': ['Male', 'Tennis'], 'Andrew': ['Male', 'Golf'], 'Carmen': ['Female', 'Basketball']} intList = [] class CreateSportList(): def sport(self): parsedData = [ '\n'.join([f"Name: {name}", f"Gender: {info[0]}", f"Sport: {info[1]}"]) for name, info in result.items() if info[1] == "{}".self for numbers in range(len(parsedData)): intList.append(numbers) print(intList) print(''.join(parsedData[int(random.choice(intList))])) CreateSportList(Tennis, Female)
期望输出示例
Enter desired sport workout: Golf Enter desired Gender. If no preference, leave blank: Female Name: Angela Gender: Female Sport: Golf
解决方案
优化版函数实现(先解决核心功能)
修正筛选逻辑,同时支持运动和性别筛选,简化随机选取流程:
import random # 人员信息字典 people = { 'Peter': ['Male', 'Basketball'], 'Carlos': ['Male', 'Tennis'], 'Angela': ['Female', 'Golf'], 'David': ['Male', 'Basketball'], 'Kaitlin': ['Female', 'Golf'], 'Marco': ['Male', 'Tennis'], 'Andrew': ['Male', 'Golf'], 'Carmen': ['Female', 'Basketball'] } def get_random_person(sport, gender=None): # 筛选符合条件的人员 filtered = [] for name, (person_gender, person_sport) in people.items(): # 运动必须匹配,性别可选匹配(None则不限制) if person_sport == sport and (gender is None or person_gender == gender): info = f"Name: {name}\nGender: {person_gender}\nSport: {person_sport}" filtered.append(info) if not filtered: return "没有找到符合条件的人员" # 直接随机返回一个结果 return random.choice(filtered) # 交互逻辑 sport_input = input("输入目标运动: ") gender_input = input("输入目标性别(无偏好请留空): ").strip() # 处理空值,转为None表示无偏好 gender_input = gender_input if gender_input else None print(get_random_person(sport_input, gender_input))
规范类实现版本(封装更易扩展)
把数据和功能封装到类中,提升代码可维护性和复用性:
import random class SportPersonSelector: def __init__(self, people_data): self.people_data = people_data def filter_people(self, sport, gender=None): filtered = [] for name, (person_gender, person_sport) in self.people_data.items(): if person_sport == sport and (gender is None or person_gender == gender): info = f"Name: {name}\nGender: {person_gender}\nSport: {person_sport}" filtered.append(info) return filtered def get_random_person(self, sport, gender=None): filtered_list = self.filter_people(sport, gender) if not filtered_list: return "没有找到符合条件的人员" return random.choice(filtered_list) # 初始化数据 people_data = { 'Peter': ['Male', 'Basketball'], 'Carlos': ['Male', 'Tennis'], 'Angela': ['Female', 'Golf'], 'David': ['Male', 'Basketball'], 'Kaitlin': ['Female', 'Golf'], 'Marco': ['Male', 'Tennis'], 'Andrew': ['Male', 'Golf'], 'Carmen': ['Female', 'Basketball'] } # 使用示例 selector = SportPersonSelector(people_data) sport_input = input("输入目标运动: ") gender_input = input("输入目标性别(无偏好请留空): ").strip() gender_input = gender_input if gender_input else None print(selector.get_random_person(sport_input, gender_input))
关键改进点
- 修正筛选逻辑:将性别空值处理为
None,筛选时自动忽略性别条件,避免原代码中==赋值错误 - 简化随机选取:直接用
random.choice()作用于筛选后的列表,无需手动生成索引列表 - 类封装优化:通过构造函数传入数据,把筛选和随机选取拆分为独立方法,提升代码扩展性
- 异常提示:添加无符合条件人员的提示,避免索引越界错误
内容的提问来源于stack exchange,提问作者bbsmfb
相关产品推荐
相关产品推荐

