您的位置:

List根据对象属性分组详解

一、基本概念

在进行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函数根据单个属性、多个属性和自定义函数进行分组,并对每组进行统计分析。实际开发中,我们可以根据具体需求灵活运用这些方法。