Python 使用元组和命名元组

  • Post category:Python

下面是Python中元组和命名元组的使用方法的完整攻略。

元组

元组是Python中的一个数据类型,可以看作是不可变的列表。与列表不同的是,元组内的元素不能被修改或删除。

创建元组

可以通过以下方式创建一个元组:

tuple1 = (1, 2, 3)

除此之外,还可以将其他数据类型转化为元组,比如将列表转化为元组:

list1 = [1, 2, 3]
tuple2 = tuple(list1)

访问元组元素

元组中的元素可以通过下标进行访问:

tuple1 = (1, 2, 3)
print(tuple1[0]) // 输出 1

切片元组

元组也支持切片操作:

tuple1 = (1, 2, 3, 4, 5)
print(tuple1[1:3]) // 输出 (2, 3)

元组拼接

可以通过 + 符号将两个元组拼接在一起:

tuple1 = (1, 2, 3)
tuple2 = (4, 5, 6)
tuple3 = tuple1 + tuple2
print(tuple3) // 输出 (1, 2, 3, 4, 5, 6)

元组解包

元组可以通过解包的方式将元素赋值给变量:

t1 = (1, 2, 3)
a, b, c = t1
print(a, b, c) // 输出 1 2 3

示例1: 排序

下面的示例演示了如何对元组进行排序:

tuple1 = (2, 8, 5, 9, 3)
sorted_tuple = tuple(sorted(tuple1))
print(sorted_tuple) // 输出 (2, 3, 5, 8, 9)

示例2: 返回多个值

元组还可以用于函数返回多个值:

def calc(a, b):
    return a+b, a-b, a*b, a/b

t1 = calc(5,3)
print(t1) // 输出 (8, 2, 15, 1.6666666666666667)

命名元组

命名元组是Python标准库collections中的一个类,它可以看作是具有字段名的元组类型。通过字段名,我们可以更方便地访问元素。

创建命名元组

创建命名元组需要使用 namedtuple 方法:

from collections import namedtuple

Person = namedtuple('Person', ['name', 'gender', 'age'])
p1 = Person('Bob', 'male', 20)
print(p1) // 输出 Person(name='Bob', gender='male', age=20)

访问命名元组

可以通过字段名访问命名元组的元素:

from collections import namedtuple

Person = namedtuple('Person', ['name', 'gender', 'age'])
p1 = Person('Bob', 'male', 20)
print(p1.name) // 输出 'Bob'

修改命名元组

由于命名元组是不可变类型,因此我们需要生成一个新的命名元组来实现修改:

from collections import namedtuple

Person = namedtuple('Person', ['name', 'gender', 'age'])
p1 = Person('Bob', 'male', 20)
p2 = p1._replace(age=21)
print(p1) // 输出 Person(name='Bob', gender='male', age=20)
print(p2) // 输出 Person(name='Bob', gender='male', age=21)

示例1: 统计成绩

下面的示例演示了如何使用命名元组来统计成绩:

from collections import namedtuple

Score = namedtuple('Score', ['name', 'math', 'english', 'computer'])
scores = [
    Score('Bob', math=89, english=78, computer=81),
    Score('Alice', math=92, english=87, computer=90),
    Score('Mike', math=76, english=88, computer=84),
    Score('Tom', math=90, english=76, computer=88),
]
avg_math = sum(s.math for s in scores) / len(scores)
avg_english = sum(s.english for s in scores) / len(scores)
avg_computer = sum(s.computer for s in scores) / len(scores)
print('Average scores: Math {:.2f}, English {:.2f}, Computer {:.2f}'.format(
    avg_math, avg_english, avg_computer
)) // 输出 Average scores: Math 86.75, English 82.25, Computer 85.75

示例2: 模拟坐标点

下面的示例演示了如何使用命名元组来表示坐标点:

from collections import namedtuple

Point = namedtuple('Point', ['x', 'y'])
p1 = Point(x=2, y=3)
p2 = Point(x=4, y=5)
print(p1.x, p1.y) // 输出 2 3
print(p1._asdict()) // 输出 {'x': 2, 'y': 3}
print(p1._replace(x=5)) // 输出 Point(x=5, y=3)