下面是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)