如何更高效计算人口年龄性别分布?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
相关产品推荐
相关产品推荐

