一、基本概念
在进行List根据对象属性分组之前,我们需要先了解几个基本概念:
List:是Python中常用的数据结构之一,是一组有序的元素集合。
对象:在Python中,一切皆是对象。对象是由类型(class)和数据(data)构成的。
属性:对象具有的特性称为属性。例如,对于一个人的对象,他的年龄、身高、性别等就是他的属性。
分组:根据某一标准,将一组数据按照相同的标准分成若干组,每组内部的元素具有相同的属性。
二、List根据单个属性分组
在实际开发中,我们常常需要将List中的元素按照某个属性进行分组。例如,有一个学生成绩单的List,我们想按照班级将学生分组,可以使用Python中的groupby函数。
from itertools import groupby class Student: def __init__(self, name, score, cls): self.name = name self.score = score self.cls = cls students = [ Student('Tom', 90, 'A'), Student('Jerry', 85, 'A'), Student('Peter', 92, 'B'), Student('Bob', 80, 'B'), Student('Alice', 95, 'C') ] students_sorted = sorted(students, key=lambda x: x.cls) for cls, group in groupby(students_sorted, key=lambda x: x.cls): print(cls) for student in group: print(student.name, student.score) print('\n')
上述代码中,我们先定义了一个Student类,包含name、score、cls三个属性。然后我们定义了一个学生列表students,将其按照班级从小到大进行排序后,使用groupby函数按照班级进行分组。
最后得到的结果是:
A
Tom 90
Jerry 85
B
Peter 92
Bob 80
C
Alice 95
三、List根据多个属性分组
有时候我们需要按照多个属性进行分组,此时我们可以先将List按照一个属性进行排序,再使用groupby函数。
students_sorted = sorted(students, key=lambda x: (x.cls, x.score)) for cls, group in groupby(students_sorted, key=lambda x: x.cls): print(cls) for student in group: print(student.name, student.score) print('\n')
上述代码中,我们先按照班级和成绩进行排序,然后按照班级进行分组。
最后得到的结果是:
A
Jerry 85
Tom 90
B
Bob 80
Peter 92
C
Alice 95
四、List根据自定义函数分组
在某些情况下,我们需要按照自定义的函数进行分组。例如,我们需要按照学生姓名的首字母分组:
students_sorted = sorted(students, key=lambda x: x.name) for first_letter, group in groupby(students_sorted, key=lambda x: x.name[0]): print(first_letter) for student in group: print(student.name, student.score) print('\n')
上述代码中,我们先按照学生姓名排序,然后按照名字的首字母进行分组。
最后得到的结果是:
A
Alice 95
B
Bob 80
J
Jerry 85
P
Peter 92
T
Tom 90
五、List根据属性值分组后进行统计
除了将List按照属性进行分组之外,我们常常还需要对每组进行统计。例如,求每个班级的平均分:
from collections import defaultdict score_dict = defaultdict(list) for student in students: score_dict[student.cls].append(student.score) for cls, scores in score_dict.items(): average_score = sum(scores) / len(scores) print(cls, average_score)
上述代码中,我们使用defaultdict函数定义了一个字典score_dict,其键为班级,值为该班级的学生分数列表。然后遍历每个班级的分数列表,求出该班级的平均分。
最后得到的结果是:
A 87.5
B 86.0
C 95.0
六、总结
List根据对象属性分组是Python中常用的数据处理方式之一。本文介绍了如何使用groupby函数根据单个属性、多个属性和自定义函数进行分组,并对每组进行统计分析。实际开发中,我们可以根据具体需求灵活运用这些方法。