Python迭代一个包含字典的列表

这是一个包含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类。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值