Python中的NamedTuple

Python中的NamedTuple

在Python中,”NamedTuple”是一种特殊的元组。对于初学者来说,它常常令人困惑,特别是为什么我们需要使用它。

NamedTuple是一个元组,因此它可以执行所有元组可以执行的功能。然而,它不仅仅是一个普通的Python元组。在其他计算机语言中,比如C++,它更类似于一个”类”。它是一个具有指定字段和定义长度的子类型,按照我们的要求在程序中创建。本教程将解释Python的NamedTuple,并展示如何使用它们,以及何时以及为什么我们需要使用它们。

什么是Python元组

在继续之前,我们认为应该重新学习一下Python中的元组。

Python中的元组是一个可以存储多个值的容器。考虑以下情况。

代码

numbers = (34, 32, 56, 24, 75, 24)

正如我们可以看到的那样,我们使用圆括号来定义它。索引用于访问元素。(请记住,在Python中索引从零开始。)

代码

numbers[1]

输出:

32

数字[1] Python元组的不同之处在于我们无法修改它的元素,即元组的元素是不可变的。

Python命名元组语法

我们首先必须从Python的内置模块collections中导入NamedTuple,如下所示:

from collections import namedtuple

以下是构建NamedTuple的基本语法:

namedtuple(Name,[Names of Values])

名称 这是我们想要给我们的NamedTuple的标题的参数,

[值的名称] 是一个占位符,用于包含不同值或属性的名称的列表。

Python NamedTuple示例

如前所述,步骤1是导入NamedTuple。

from collections import namedtuple

现在我们可以使用上一部分的语法来构建一个NamedTuple:

Student = namedtuple("Student",["Name","Class","Age","Subject","Marks"])

在这个示例中,我们选择将NamedTuple命名为Student,并在一个列表中提及值的名称,”Name”、”Class”、”Age”、”Subject”和”Marks”。我们已经创建了我们的第一个NamedTuple – Student。

现在,我们可以使用Student创建一个具有所需规格的学生Student1,如下所示:

Studnet1 = Student("Itika", 11, 15, "English", 79)

只需要[名称值]中的标签或字段所需的特定值或内容。

要录入一个新的学生,比如学生2,复制其值并粘贴到新变量的字段中。

Studnet2 = Student("Arshia", 12, 17, "Maths", 93)

我们将看到,我们可以使用Student作为蓝图,根据需要记录新的学生,而无需每次都调用字段的标签。

如何使用点符号获取NamedTuple的值

我们可以使用点方法来获取NamedTuple实例Student1和Student2的值。以下是语法:

<name of object>.<name of field>

以下代码示例演示了此功能:

代码

print (Student1.Age)
print (Student1.Class)
print (Student1.Subject)
print (Student1.Marks)
print (Student1.Name)

输出:

15
11
"English"
79
"Itika"

同样,我们可以使用Student2.Age,Student2.Class等来检索与NamedTuple Student2相关的变量。

NamedTuple的访问方法

我们可以使用索引、关键字和getattr()函数从NamedTuple中检索值。NamedTuple的字段值是严格有序的。因此,我们可以使用索引来找到它们。

字段名称通过NamedTuple转换为属性。因此,getattr()可以用来从该字段中检索数据。

代码

import collections
#create employee NamedTuple
Participant = collections.namedtuple('Participant', ['Name', 'Age', 'Country'])
#Adding two participants
p1 = Participant('Itika', '21', 'India')
p2 = Participant('Arshia', '19', 'Australia')
#Accessing the items using index
print( 'The name and country of the first participant are: ' + p1[0] + ' and ' + p1[2])
#Accessing the items using name of the field
print( 'The name and country of the second participant are: ' + p2.Name + ' and ' + p2.Country)
#Accessing the items using the method: getattr()
print( 'The Age of participant 1 and 2 are: ' + getattr(p1, 'Age') + ' and ' + getattr(p2, 'Age'))

输出:

The name and country of the first participant are: Itika and India
The name and country of the second participant are: Arshia and Australia
The Age of participant 1 and 2 are: 21 and 19

NamedTuple的转换过程

不同的集合可以使用几种技术转换为NamedTuple。我们还可以使用_make()函数将列表、元组或其他可迭代对象转换为NamedTuple实例。

我们还可以将字典数据类型对象转换为NamedTuple集合。这需要使用 ** 运算符进行转换。

作为有序字典数据类型项,NamedTuple可以使用其键生成项。我们可以调用_asdict()函数将其转换为有序字典。

代码

import collections
#create employee NamedTuple
Participant = collections.namedtuple('Participant', ['Name', 'Age', 'Country'])
#List to Participants
list_ = ['Itika', '21', 'India']
p1 = Participant._make(list_)
print(p1)
#Dict to convert Employee
dict_ = {'Name':'Arshia', 'Age' : '19', 'Country' : 'Australia'}
p2 = Participant(**dict_)
print(p2)
#Displaying the namedtuple as dictionary
participant_dict = p1._asdict()
print(participant_dict)

输出:

Participant(Name='Itika', Age='21', Country='India')
Participant(Name='Arshia', Age='19', Country='Australia')
{'Name': 'Itika', 'Age': '21', 'Country': 'India'}

更多对于NamedTuple的操作

还有其他的方法,比如_fields()和_replace,都可以使用。我们可以通过调用_fields()函数来确定NamedTuple有哪些字段。而_replace()函数则用于将一个值替换为另一个值。

代码

import collections
#create employee NamedTuple
Participant = collections.namedtuple('Participant', ['Name', 'Age', 'Country'])
#List to Participants
p1 = Participant('Itika', '21', 'India')
print(p1)
print('The fields of Participant: ' + str(p1._fields))
#updating the country of participant p1
p1 = p1._replace(Country = 'Germany')
print(p1)

输出:

Participant(Name='Itika', Age='21', Country='India')
The fields of Participant: ('Name', 'Age', 'Country')
Participant(Name='Itika', Age='21', Country='Germany')

Python的NamedTuple是如何工作的?

让我们来看看在Python中使用NamedTuple可以实现什么额外的功能。

1. Python中的NamedTuple是不可变的。

Python中的NamedTuple不能被修改,就像它的普通版本一样。我们不能改变它的特征。

我们将尝试修改一个名为’Student’的元组的特征,以此来演示这一点。

代码

from collections import namedtuple
Student = namedtuple("Student",["Name","Class","Age","Subject","Marks"])
Student1 = Student("Arshia", 12, 17, "Maths", 93)
Student1.Class = 11

输出:

AttributeError                            Traceback (most recent call last)
Input In [41], in ()
      2 Student = namedtuple("Student",["Name","Class","Age","Subject","Marks"])
      3 Student1 = Student("Arshia", 12, 17, "Maths", 93)
----> 4 Student1.Class = 11

AttributeError: can't set attribute

如图所示,它抛出了一个AttributeError。因此,我们可以推断一个NamedTuple是不可变的。

2. 从一个Python NamedTuple创建一个Python字典

在Python中,一个NamedTuple类似于一个字典,我们可以通过以下方式将其转换为一个字典:

代码

from collections import namedtuple
Student = namedtuple("Student",["Name","Class","Age","Subject","Marks"])
Student1 = Student("Arshia", 12, 17, "Maths", 93)
print ( Student1._asdict() )

输出:

{'Name': 'Arshia', 'Class': 12, 'Age': 17, 'Subject': 'Maths', 'Marks': 93}

我们使用.asdict()方法来实现这一目标。这也会产生一个Python有序字典。

3. 具有默认值的命名元组

可以通过与设置常规类属性的初始值相同的方式,为命名元组类配置默认参数。默认值分配给最右边的属性,因为具有默认值的字段应该在没有默认值的字段后出现。

让我们使用只有1个默认条目重新定义Student类。

代码

from collections import namedtuple
Student = namedtuple("Student", ["Name","Class","Age","Subject","Marks"], defaults = [100])
Student1 = Student("Arshia", 12, 17, "Maths")
print ( Student1 )

输出:

Student(Name='Arshia', Class=12, Age=17, Subject='Maths', Marks=100)

默认情况下,如果我们只使用一个值创建NamedTuple,则默认值为100,即我们声明中最右边的字段。

如果我们明确指定字段为“Age”,默认值“Age”会被应用吗?

代码

from collections import namedtuple
Student = namedtuple("Student", ["Name","Class","Age","Subject","Marks"], defaults = [100])
Student1 = Student("Arshia", 12, 17, "Maths")
Student1 = Student(Age = 18)
print ( Student1 )

输出:

TypeError: Student.__new__() missing 3 required positional arguments: 'Name', 'Class', and 'Subject'

答案是否定的。在命名元组中,字段的排序非常严格。即使我们明确声明了任何内容,但默认值必须是最右边的,以防止歧义和潜在困难。

Python命名元组的优点

当然,如果没有看到任何优势,没有人会使用命名元组。所以,这是我们得到的:

1. 与标准元组不同,Python中的命名元组可以通过它们的标题来检索变量。

代码

from collections import namedtuple
Student = namedtuple("Student", ["Name","Class","Age","Subject","Marks"], defaults = [100])
Student1 = Student("Arshia", 12, 17, "Maths")
print ( Student1.Age )

输出:

17

保留HTML格式:

2.因为它不包含每个实例的字典,所以Python的NamedTuple在内存中的效率与传统元组相同。因此,它比字典更快。

结论

我们学习了如何使用NamedTuples结合元组和字典的优点,如何构建NamedTuples以及如何在本教程中使用它们。如何使用Python的点表示法检索NamedTuples的值,以及它们如何运行。

如果读者熟悉Python的面向对象编程(OOP),他们会发现这与Python类的运作方式完全相同。一个类及其属性充当创建更多对象或实例的蓝图,每个对象有自己独特的属性值。

但为了增加代码的清晰度,通常定义一个类并提供必要的特征过于冗长,因此使用NamedTuples构建速度更快。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程