python具名元组(namedtuple)的具体使用

  • Post category:Python

当我们需要用到很多类似元素的数据结构时,常常使用元组。元组的一个缺点是,当我们访问元素时,只能使用索引来获取,这样会导致代码的可读性变差。而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具名元组的具体使用,下面我们来看看一个更加实际的例子。

在下面的示例中,我们定义了一个汽车类,其中包含modelyearprice属性。我们可以将这些汽车的属性保存在一个列表中,并对其进行排序。但是,当我们使用元组时,需要使用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表达式,并在排序时使用元组的属性名。这样可以使我们的代码更加清晰易懂。