当我们需要用到很多类似元素的数据结构时,常常使用元组。元组的一个缺点是,当我们访问元素时,只能使用索引来获取,这样会导致代码的可读性变差。而python中提供了一种叫做“具名元组”的结构,解决了这个问题。它的使用方式类似于普通元组,但每个属性都拥有一个名字,可以通过属性名来访问元素。
1. 定义具名元组
要使用具名元组,需要先导入namedtuple
模块,然后通过命令namedtuple(typename, field_names)
定义一个具名元组。其中,typename
是此具名元组的名称,比如我们可以定义一个叫做Point
的具名元组;field_names
是元素名称序列,可以是一个字符串,也可以是一个由字符串组成的列表或元组。
下面是一个示例:
from collections import namedtuple
# 定义一个名为Person的具名元组
Person = namedtuple('Person', ['name', 'age', 'gender'])
# 使用具名元组创建一个人的实例,并给元素赋值
person = Person(name='Tom', age=25, gender='male')
print(person)
# 输出:Person(name='Tom', age=25, gender='male')
2. 访问元素
通过属性名来访问元素是具名元组的一大特点。具名元组可以像普通元组一样,使用索引来访问元素,但更为方便的是,我们可以使用属性名来访问元素。
下面是一个示例:
from collections import namedtuple
City = namedtuple('City', ['name', 'country', 'population'])
newyork = City('New York', 'USA', 8.5)
print(newyork.name) # 输出:New York
print(newyork[0]) # 输出:New York
# 修改City元组的值
newyork = newyork._replace(population=9)
print(newyork) # 输出:City(name='New York', country='USA', population=9)
在上面的示例中,我们定义了一个名为City
的具名元组,然后对newyork
实例的元素进行了赋值。最后,我们使用属性名和索引来访问newyork
实例的属性。需要注意的是,因为具名元组的属性是只读的,因此我们需要使用_replace()
方法来改变元组实例的某些属性值。
3. 示例
为了更加详细地了解python具名元组的具体使用,下面我们来看看一个更加实际的例子。
在下面的示例中,我们定义了一个汽车类,其中包含model
,year
和price
属性。我们可以将这些汽车的属性保存在一个列表中,并对其进行排序。但是,当我们使用元组时,需要使用lambda
函数来指定按哪个属性进行排序。
class Car:
def __init__(self, model, year, price):
self.model = model
self.year = year
self.price = price
car_list = [
Car('Ford Mustang', 1964, 15000),
Car('Maserati GranTurismo', 2007, 70000),
Car('Chevrolet Corvette', 1953, 25000)
]
# 使用具名元组改进汽车类
Car = namedtuple('Car', ['model', 'year', 'price'])
car_list = [
Car('Ford Mustang', 1964, 15000),
Car('Maserati GranTurismo', 2007, 70000),
Car('Chevrolet Corvette', 1953, 25000)
]
# 按价格进行排序
sorted_cars = sorted(car_list, key=lambda x: x.price)
print(sorted_cars)
# 输出:[
# Car(model='Ford Mustang', year=1964, price=15000),
# Car(model='Chevrolet Corvette', year=1953, price=25000),
# Car(model='Maserati GranTurismo', year=2007, price=70000)
# ]
使用具名元组后,我们可以省略掉lambda
表达式,并在排序时使用元组的属性名。这样可以使我们的代码更加清晰易懂。