Python 命名元组收集数据

  • Post category:Python

下面是Python命名元组收集数据的完整攻略。

什么是命名元组?

命名元组(named tuple)是Python标准库中的一个数据类型,它的作用是生成一个具备名称的数据类型,类似于结构体(struct)或小型的类。命名元组的定义可以看作是一个新的类,这个类继承自tuple,有tuple的所有方法,同时拥有自己的属性。

如何使用命名元组?

使用命名元组需要先导入collections模块,然后使用collections.namedtuple函数来定义一个新的命名元组类型。函数的参数包括新类型的名称和各个字段的名称,字段名可以是单个字符串、字符串列表或字符串(名称,默认值)元组的列表。例如,定义一个命名元组Point

from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])

这段代码定义了一个新的类型Point,它有两个属性xy。可以通过下标访问元组的属性:

p = Point(1, 2)
print(p[0])  # 1
print(p.x)   # 1

也可以通过unpacking的方式获得元组的各个属性:

x, y = p
print(x, y)  # 1 2

元组是不可变的,但可以通过_replace方法替换其中的某些属性:

p = p._replace(x=3)
print(p)     # Point(x=3, y=2)

如何使用命名元组收集数据?

使用命名元组可以方便地收集一些结构化的数据,例如对于一组学生的信息,可以定义一个Student类型,包含nameagescore三个属性:

from collections import namedtuple
Student = namedtuple('Student', ['name', 'age', 'score'])

然后可以定义一个列表,存储所有学生的信息:

students = [
    Student('Alice', 18, 90),
    Student('Bob', 20, 85),
    Student('Charlie', 19, 88),
    Student('David', 21, 92)
]

这样就可以方便地进行数据分析,例如计算平均分:

scores = [s.score for s in students]
avg_score = sum(scores) / len(scores)
print('Average score:', avg_score)

查找年龄最小的学生:

youngest = min(students, key=lambda s: s.age)
print('Youngest student:', youngest.name)

上面这两条例子展示了命名元组的灵活和方便,让程序员可以不用写冗长的类定义,就可以轻松地处理结构化数据。

示例一:收集学生信息

以下示例演示了如何使用命名元组收集学生的信息,计算平均分和年龄最小的学生:

from collections import namedtuple

Student = namedtuple('Student', ['name', 'age', 'score'])
students = [
    Student('Alice', 18, 90),
    Student('Bob', 20, 85),
    Student('Charlie', 19, 88),
    Student('David', 21, 92)
]

scores = [s.score for s in students]
avg_score = sum(scores) / len(scores)
print('Average score:', avg_score)

youngest = min(students, key=lambda s: s.age)
print('Youngest student:', youngest.name)

输出结果为:

Average score: 88.75
Youngest student: Alice

示例二:收集医生信息

以下示例演示了如何使用命名元组收集医生的信息,计算工龄最短的医生:

from collections import namedtuple

Doctor = namedtuple('Doctor', ['name', 'age', 'title', 'years_of_service'])
doctors = [
    Doctor('Alice', 30, 'Chief Physician', 5),
    Doctor('Bob', 35, 'Associate Chief Physician', 6),
    Doctor('Charlie', 28, 'Attending Doctor', 3),
    Doctor('David', 33, 'Resident Doctor', 2)
]

youngest = min(doctors, key=lambda d: d.years_of_service)
print('Youngest doctor:', youngest.name)

输出结果为:

Youngest doctor: David

以上就是使用命名元组收集数据的完整攻略。