Python数据结构与算法(5)---namedtuple

简介: Python数据结构与算法(5)---namedtuple

前言


Python中,我们使用元组往往是直接按其索引进行操作的。比如一个c元组(1,2,3),那么获取2值c[1]。对于简单的数据而言,这种操作没有什么问题。


但数据结构的重点,就是在实际的需求多样化中,找到最符合的数据结构进行数据的操作变更。而当元组tuple有大量数据时,记住各个值对应哪个索引,显然是不可能的。而namedtuple除了为各个成员指定数值索引外,还为其指定了名字。


本篇,将详细介绍namedtuple的使用方式以及优点。


初识namedtuple


与常规的元组一样,namedtuple实例在内存使用方面同样很高效,因为它们没有每一个实例的字典。各种namedtuple都由自己的类表示,这个类使用namedtuple()工厂函数来创建。参数就是新类名和一个包含元素名的字符串。


具体示例如下:

import collections
Person = collections.namedtuple('Person', 'name age')
lyj = Person(name="Li YuanJing", age=28)
fxy = Person(name='Feng XinYao', age=30)
hf = Person(name='He Fan', age=28)
for person in [lyj, fxy, hf]:
    print(person.name, person.age)


运行之后,效果如下:


需要注意的是,在python中常规元组是不可修改的,namedtuple也一样。这个限制允许tuple实例具有一致的散列值,这使得可以把它们用作字典中的键并包含在集合中。


非法字段处理


在实际的编程中,我们变量的起名一般都会与编程语言的关键字岔开。因为取一个和编程语言一样的关键字名称,会被系统提示报错。


而namedtuple也一样,不过我们可以进行规避。首先,我们先来看一看使用关键字会有什么效果:

import collections
Person = collections.namedtuple('Person', 'name age class')


运行之后,效果如下:


如上面代码所示,我们使用了关键字class,运行程序会直接报ValueError错误。那么,namedtuple是如何规避这种错误的呢?不妨我们在来看一段代码。

import collections
Person = collections.namedtuple('Person', 'name age class', rename=True)


通过第3个参数:rename,我们可以防止namedtuple报错。但是哪怕这样能运行。也不能直接赋值。但可以通过别名赋值,具体可以看下面的代码。


需要注意的是,rename并不仅仅只是用来规避错误的,而是当有重复的属性时,依旧可以赋值。具体代码如下:

import collections
Person = collections.namedtuple('Person', 'name age age', rename=True)
print(Person._fields)
a = Person(name='tom', age=25, _2=255)
print(a)


class属性与重复属性同理。


_asdict()


对于namedtuple来说,创建的实例是不允许进行更改的。那么,如果后续的处理需要进行更改怎么办?这里,我们可以直接把namedtuple转换为OrderedDict进行处理。


具体代码如下:

import collections
Person = collections.namedtuple('Person', 'name age age', rename=True)
a = Person(name='tom', age=25, _2=255)
print(a)
b = a._asdict()
print(b)
b['name'] = '123'
print(b)


运行之后,效果如下:


_replace()


namedtuple还有一个函数,就是_replace()。从前面的字符串处理中,我们可以大致猜出来,这个函数就是替换值得。但是前面说了namedtuple是不能更改的。那这个函数的意义是什么?


其实,_replace()函数虽然看起来替换了原来的值,但它只是返回了一个新的namedtuple实例,并未对之前的实例造成任何修改。我们来看一段代码就清楚了:

import collections
Person = collections.namedtuple('Person', 'name age')
a = Person(name='tom', age=25)
print("原始a值")
print(a)
print("------------------")
b = a._replace(name='jerry')
print("replace后的ab值")
print(a)
print(b)


运行之后,效果如下:

相关文章
|
2天前
|
算法 开发者 计算机视觉
燃爆全场!Python并查集:数据结构界的网红,让你的代码炫酷无比!
在编程的世界里,总有一些数据结构以其独特的魅力和高效的性能脱颖而出,成为众多开发者追捧的“网红”。今天,我们要介绍的这位明星,就是Python中的并查集(Union-Find)——它不仅在解决特定问题上大放异彩,更以其优雅的设计和强大的功能,让你的代码炫酷无比,燃爆全场!
9 0
|
21小时前
|
存储 算法 安全
Python 加密算法详解与应用
Python 加密算法详解与应用
6 1
|
3天前
|
存储 算法 Python
火箭般的提升!学会Python并查集,让你的算法能力飞跃新高度!
火箭般的提升!学会Python并查集,让你的算法能力飞跃新高度!
12 1
|
13天前
|
存储 索引 Python
Python常用数据结构——集合
Python常用数据结构——集合
32 3
|
13天前
|
存储 数据安全/隐私保护 Python
Python常用数据结构——字典的应用
Python常用数据结构——字典的应用
14 2
|
15天前
|
Python
逆天改命!掌握Python并查集,数据结构难题从此不再是你的痛!
在编程旅程中,遇到棘手的数据结构难题是否让你苦恼?别担心,Python并查集(Union-Find)是你的得力助手。这是一种高效处理不相交集合合并及查询的数据结构,广泛应用于网络连通性、社交网络圈子划分等场景。通过维护每个集合的根节点,它实现了快速合并与查询。本文将介绍并查集的基本概念、应用场景以及如何在Python中轻松实现并查集,帮助你轻松应对各种数据结构挑战。
26 3
|
15天前
|
大数据 UED 开发者
实战演练:利用Python的Trie树优化搜索算法,性能飙升不是梦!
在数据密集型应用中,高效搜索算法至关重要。Trie树(前缀树/字典树)通过优化字符串处理和搜索效率成为理想选择。本文通过Python实战演示Trie树构建与应用,显著提升搜索性能。Trie树利用公共前缀减少查询时间,支持快速插入、删除和搜索。以下为简单示例代码,展示如何构建及使用Trie树进行搜索与前缀匹配,适用于自动补全、拼写检查等场景,助力提升应用性能与用户体验。
35 2
|
17天前
|
算法 程序员 Python
程序员必看!Python复杂度分析全攻略,让你的算法设计既快又省内存!
在编程领域,Python以简洁的语法和强大的库支持成为众多程序员的首选语言。然而,性能优化仍是挑战。本文将带你深入了解Python算法的复杂度分析,从时间与空间复杂度入手,分享四大最佳实践:选择合适算法、优化实现、利用Python特性减少空间消耗及定期评估调整,助你写出高效且节省内存的代码,轻松应对各种编程挑战。
26 1
|
21小时前
|
算法 安全 Go
Python与Go语言中的哈希算法实现及对比分析
Python与Go语言中的哈希算法实现及对比分析
7 0
|
21小时前
|
安全 测试技术 Go
Python 和 Go 实现 AES 加密算法的技术详解
Python 和 Go 实现 AES 加密算法的技术详解
6 0