这是一个包含3个字典的Python列表,每个字典都包含学生的信息,包括姓名、性别、年龄、班级、语文、数学和英语成绩。
students = [
{'name': '张三', 'gender': 'male', 'age': 18, 'class': 'class1', 'chinese': 80, 'math': 90, 'english': 85},
{'name': '李四', 'gender': 'male', 'age': 16, 'class': 'class2', 'chinese': 70, 'math': 85, 'english': 80},
{'name': '王五', 'gender': 'female', 'age': 15, 'class': 'class3', 'chinese': 90, 'math': 95, 'english': 90}
]
统计女生和男生的人数
方式1 普通循环
male_count = 0
female_count = 0
for student in students:
if student['gender'] == 'male':
male_count += 1
elif student['gender'] == 'female':
female_count += 1
print("男生人数:", male_count)
print("女生人数:", female_count)
方式2 列表推导式
male_count = sum(student['gender'] == 'male' for student in students)
female_count = sum(student['gender'] == 'female' for student in students)
print("男生人数:", male_count)
print("女生人数:", female_count)
方式3 Counter类
使用Python的collections模块中的Counter类。这个类可以对一个列表或者可迭代对象进行计数,返回一个字典,其中键是列表中的每个元素,值是该元素在列表中出现的次数。
from collections import Counter
gender_counts = Counter(student['gender'] for student in students)
male_count = gender_counts['male']
female_count = gender_counts['female']
print("男生人数:", male_count)
print("女生人数:", female_count)
方式4 内置函数filter()和lambda表达式
male_count = len(list(filter(lambda s: s['gender'] == 'male', students)))
female_count = len(list(filter(lambda s: s['gender'] == 'female', students)))
print("男生人数:", male_count)
print("女生人数:", female_count)
这个代码首先使用lambda表达式定义了一个匿名函数,用于过滤出性别为’male’或’female’的学生。然后,我们使用内置函数filter()将这个函数应用到学生列表中的每个学生,并得到一个新的迭代器对象。接下来,我们使用内置函数len()和list()分别将迭代器转换为列表并计算列表的长度,得到男生和女生的人数。
需要注意的是,这种实现方式可能不如前面的方法直观易懂,并且会生成中间结果列表,可能会浪费一些内存。因此,如果不是特别需要,建议还是使用前面的方法。
总结
通常情况下,使用列表推导式和Counter类的性能差异不大,都可以处理较小规模的数据集。但是当数据量非常大时,Counter类会更快一些,因为它是使用C实现的,速度更快,而且它还提供了更多的统计方法。
另外,列表推导式通常需要在内存中创建中间结果列表,所以如果数据集非常大,这可能会导致内存问题。而Counter类则可以直接在计数字典上进行操作,不需要额外的内存空间。
因此,如果你处理的数据集较小,使用列表推导式可能更加直观简洁;如果你处理的数据集非常大,或者需要进行更多的统计操作,建议使用Counter类。