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

如何更高效计算人口年龄性别分布?Python代码优化需求

精简年龄-性别分组统计代码的实现方案

我正在处理一项数据分析任务,需要判断数据集的人口分布是否具有美国人口代表性。我想找一种相对简单、无需额外库且比现有方案更紧凑的实现方式。我觉得字典是理解数据的简便方式,所以创建了包含所有所需年龄-性别键(数据覆盖18-64岁)的空值字典。下面是我目前用的代码,里面大量用了elif语句来匹配并累加对应键的值,但我肯定有更精简的解决方案:

def age_sex_sort(self):
    self.age_sex_dictionary = {
        "18 to 19, Male": 0,
        "18 to 19, Female": 0,
        "20 to 24, Male": 0,
        "20 to 24, Female": 0,
        "25 to 29, Male": 0,
        "25 to 29, Female": 0,
        "30 to 34, Male": 0,
        "30 to 34, Female": 0,
        "35 to 39, Male": 0,
        "35 to 39, Female": 0,
        "40 to 44, Male": 0,
        "40 to 44, Female": 0,
        "45 to 49, Male": 0,
        "45 to 49, Female": 0,
        "50 to 54, Male": 0,
        "50 to 54, Female": 0,
        "55 to 59, Male": 0,
        "55 to 59, Female": 0,
        "60 to 64, Male": 0,
        "60 to 64, Female": 0}
    for (age, sex) in zip(self.patients_ages, self.patients_sexes):
        if sex == "male":
            if int(age) < 20:
                self.age_sex_dictionary["18 to 19, Male"] += 1
            elif int(age) < 25:
                self.age_sex_dictionary["20 to 24, Male"] += 1
            elif int(age) < 30:
                self.age_sex_dictionary["25 to 29, Male"] += 1
            elif int(age) < 35:
                self.age_sex_dictionary["30 to 34, Male"] += 1
            elif int(age) < 40:
                self.age_sex_dictionary["35 to 39, Male"] += 1
            elif int(age) < 45:
                self.age_sex_dictionary["40 to 44, Male"] += 1
            elif int(age) < 50:
                self.age_sex_dictionary["45 to 49, Male"] += 1
            elif int(age) < 55:
                self.age_sex_dictionary["50 to 54, Male"] += 1
            elif int(age) < 60:
                self.age_sex_dictionary["55 to 59, Male"] += 1
            elif int(age) < 65:
                self.age_sex_dictionary["60 to 64, Male"] += 1
        else:
            if int(age) < 20:
                self.age_sex_dictionary["18 to 19, Female"] += 1
            elif int(age) < 25:
                self.age_sex_dictionary["20 to 24, Female"] += 1
            elif int(age) < 30:
                self.age_sex_dictionary["25 to 29, Female"] += 1
            elif int(age) < 35:
                self.age_sex_dictionary["30 to 34, Female"] += 1
            elif int(age) < 40:
                self.age_sex_dictionary["35 to 39, Female"] += 1
            elif int(age) < 45:
                self.age_sex_dictionary["40 to 44, Female"] += 1
            elif int(age) < 50:
                self.age_sex_dictionary["45 to 49, Female"] += 1
            elif int(age) < 55:
                self.age_sex_dictionary["50 to 54, Female"] += 1
            elif int(age) < 60:
                self.age_sex_dictionary["55 to 59, Female"] += 1
            elif int(age) < 65:
                self.age_sex_dictionary["60 to 64, Female"] += 1
    return self.age_sex_dictionary

优化方案1:通过计算生成分组键

直接用数学计算推导年龄对应的分组区间,彻底消除重复的elif判断和性别分支:

def age_sex_sort(self):
    # 自动生成所有分组键
    age_groups = ["18 to 19"] + [f"{i} to {i+4}" for i in range(20, 65, 5)]
    sexes = ["Male", "Female"]
    self.age_sex_dictionary = {f"{group}, {sex}": 0 for group in age_groups for sex in sexes}

    for age_str, sex in zip(self.patients_ages, self.patients_sexes):
        age = int(age_str)
        # 确定年龄分组
        if age < 20:
            group = "18 to 19"
        else:
            # 计算分组起始年龄:20-24对应20,25-29对应25,以此类推
            start_age = (age // 5) * 5
            group = f"{start_age} to {start_age + 4}"
        # 统一性别格式为首字母大写
        formatted_sex = sex.capitalize()
        # 累加对应分组的计数
        self.age_sex_dictionary[f"{group}, {formatted_sex}"] += 1

    return self.age_sex_dictionary

优化方案2:预定义年龄-分组映射表

如果不想用计算逻辑,可以提前构建年龄到分组的映射字典,通过直接查找快速匹配分组:

def age_sex_sort(self):
    # 构建年龄到分组的映射
    age_to_group = {}
    # 处理18-19岁区间
    for age in range(18, 20):
        age_to_group[age] = "18 to 19"
    # 处理20-64岁的5年分组
    for start in range(20, 65, 5):
        for age in range(start, start + 5):
            age_to_group[age] = f"{start} to {start + 4}"
    
    # 生成统计字典(自动去重分组键)
    unique_groups = list(set(age_to_group.values()))
    sexes = ["Male", "Female"]
    self.age_sex_dictionary = {f"{group}, {sex}": 0 for group in unique_groups for sex in sexes}

    for age_str, sex in zip(self.patients_ages, self.patients_sexes):
        age = int(age_str)
        group = age_to_group[age]
        formatted_sex = sex.capitalize()
        self.age_sex_dictionary[f"{group}, {formatted_sex}"] += 1

    return self.age_sex_dictionary

优化后的优势

  • 代码紧凑度大幅提升,消除了大量重复的分支判断
  • 分组键通过生成式或映射表自动创建,避免手动编写所有键的繁琐和出错可能
  • 逻辑清晰,后续调整分组区间只需修改少量参数即可,维护性更强

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 20:10:05