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

如何用类或函数实现按运动、性别筛选并随机获取字典数据

实现支持运动和性别筛选的随机人员信息查询工具

我现有一段代码可实现输入指定运动后,筛选并随机获取对应人员的信息,但仅支持按运动筛选。希望同时支持按性别筛选(性别可留空表示无偏好),还尝试用类优化实现但代码存在问题,寻求帮助解决。

现有可运行代码(仅支持运动筛选)

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))

关键改进点

  1. 修正筛选逻辑:将性别空值处理为None,筛选时自动忽略性别条件,避免原代码中==赋值错误
  2. 简化随机选取:直接用random.choice()作用于筛选后的列表,无需手动生成索引列表
  3. 类封装优化:通过构造函数传入数据,把筛选和随机选取拆分为独立方法,提升代码扩展性
  4. 异常提示:添加无符合条件人员的提示,避免索引越界错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 06:57:36