python 命名元组(namedtuple)
我们知道c/c++语言中,有结构体这种数据类型:
struct{
string name;
int age;
char sex;
}student;
在对结构体对象进行赋值或者取值时可以使用.运算符进行操作。
那么问题来,python中有没有这个数据类型呢?答案是肯定有的,它就是命名元组(namedtyple)。
首先来看一下python中普通元组的不方便之处:
Bob=("bob",30,'male')
#如果想知道Bobde 名字,则需要使用索引位置进行读取,如下
name=Bob[0]
for people in [Bob]:
print("%s is %d years old %s" % peole)
#显示结果
bob is 30 years old male
1、namedtuple基础
通过上面的例子,访问元祖数据的时候是通过索引下标来操作的,对此需要熟记每个下标对应的具体含义,如果元祖有成千上百个数据,那么想记住每个下标对应的意义那是相当困难的,于是就出现了命名元祖namedtuple。
namedtuple对象的定义如以下格式:
collections.namedtuple(typename, field_names, verbose=False, rename=False)
返回一个命名元祖子类typename,其中参数的意义如下:
typename,:此元组的名称;
field_names: 元祖中元素的名称(类似于c结构体中的age等),此字段有多种表达方式,见例子;
rename:如果元素名称中含有python的关键字,则必须设置为rename=True,具体见下面;
verbose:默认就好;
举个小例子,加深一下自己的理解:
import collections
#其中field_names 有多种表达方式,如下
student=collections.namedtuple('student','name age sex')
student=cpllections.namedtuple('student',['name','age','sex'])
student=cpllections.namedtuple('student','name,age,sex')
spark=student(name='sunYang',age=20,sex='male')
print(spark)
print("spark's name is %s" % spark.name)
print("%s is %d years old %s" % spark)
显示结果如下:
student(name='sunYang', age=20, sex='male')
spark's name is sunYang
sunYang is 20 years old male
通过上面的例子 其中student是元祖名称,‘name age sex’是元组总元素名称,用空格隔开,我们访问元祖对象中的元素时可以使用逗号操作符(.)读取对象中某个感兴趣的元素,而不必像原始元组中,需要记录下标代表的元素含义。
下面了解一下rename参数的作用:
import collections
with_class=collections.namedtuple('Person','name age class gender',rename=True)
print with_class._fields
two_ages=collections.namedtuple('Person','name age gender age',rename=True)
print two_ages._fields其输出结果为:
('name', 'age', '_2', 'gender')
('name', 'age', 'gender', '_3')
我们使用rename=True的方式打开重命名选项。
可以看到第一个集合中的class被重命名为 ‘2′ ; 第二个集合中重复的age被重命名为 ‘_3′;这是因为namedtuple在重命名的时候使用了下划线 加元素所在索引数的方式进行重命名。
2、namedtuple高级用法
我们通过定义一个命名元组,如下:
Point = namedtuple(‘Point’, [‘x’, ‘y’], verbose=True)
那么Point是一个元祖的子类,类结构具体如下:
class Point(tuple):
'Point(x, y)'
__slots__ = ()
_fields = ('x', 'y')
def __new__(_cls, x, y):
'Create new instance of Point(x, y)'
return _tuple.__new__(_cls, (x, y))
@classmethod
def _make(cls, iterable, new=tuple.__new__, len=len):
'Make a new Point object from a sequence or iterable'
result = new(cls, iterable)
if len(result) != 2:
raise TypeError('Expected 2 arguments, got %d' % len(result))
return result
def __repr__(self):
'Return a nicely formatted representation string'
return 'Point(x=%r, y=%r)' % self
def _asdict(self):
'Return a new OrderedDict which maps field names to their values'
return OrderedDict(zip(self._fields, self))
def _replace(_self, **kwds):
'Return a new Point object replacing specified fields with new values'
result = _self._make(map(kwds.pop, ('x', 'y'), _self))
if kwds:
raise ValueError('Got unexpected field names: %r' % kwds.keys())
return result
def __getnewargs__(self):
'Return self as a plain tuple. Used by copy and pickle.'
return tuple(self)
__dict__ = _property(_asdict)
def __getstate__(self):
'Exclude the OrderedDict from pickling'
pass
x = _property(_itemgetter(0), doc='Alias for field number 0')
y = _property(_itemgetter(1), doc='Alias for field number 1')
python 命名元组(namedtuple)的更多相关文章
- python-Day3-set 集合-counter计数器-默认字典(defaultdict) -可命名元组(namedtuple)-有序字典(orderedDict)-双向队列(deque)--Queue单项队列--深浅拷贝---函数参数
上节内容回顾:C语言为什么比起他语言块,因为C 会把代码变异成机器码Pyhton 的 .pyc文件是什么python 把.py文件编译成的.pyc文件是Python的字节码, 字符串本质是 字符数组, ...
- python中的命名元组namedtuple
namedtuple是继承自tuple的子类.namedtuple创建一个和tuple类似的对象,而且对象拥有可访问的属性 可利用collections.namedtuple构建一个简单的类. fro ...
- Python 命名元组
from collections import namedtuple # 类 p = namedtuple("Point", ["x", "y&quo ...
- python基础知识4——collection类——计数器,有序字典,默认字典,可命名元组,双向队列
1.计数器(counter) Counter是对字典类型的补充,用于追踪值的出现次数. ps:具备字典的所有功能 + 自己的功能 Counter 我们从中挑选一些相对常用的方法来举例: 在上面的例子 ...
- Python collections系列之可命名元组
可命名元组(namedtuple) 根据nametuple可以创建一个包含tuple所有功能以及其他功能的类 1.创建一个坐标类 import collections # 创建类, defaultd ...
- Python元组与字符串操作(9)——随机数、元组、命名元组
随机数 import random #导入random模块 randint(a,b) 返回[a,b]之间的整数 random.randint(0,9) randrange([start],stop,[ ...
- Python namedtuple(命名元组)使用实例
Python namedtuple(命名元组)使用实例 #!/usr/bin/python3 import collections MyTupleClass = collections.namedtu ...
- Python 学习 第十四篇:命名元组
Python的元组不能为元组内部的数据进行命名,而 collections.namedtuple 可以来构造一个含有字段名称的元组类,命名元组可以通过逗号+字段名来获取元素值: collections ...
- python之命名元组的好处
collections.namedtuple() 命名元组的一个主要用途是将你的代码从下标操作中解脱出来举例使用 # 使用 from collections import namedtuple Sub ...
随机推荐
- SWIFT中使用AFNetwroking访问网络数据
AFNetworking 是 iOS 一个使用很方便的第三方网络开发框架,它可以很轻松的从一个URL地址内获取JSON数据. 在使用它时我用到包管理器Cocoapods 不懂的请移步: Cocoapo ...
- HDU 3364
http://acm.hdu.edu.cn/showproblem.php?pid=3364 经典高斯消元解开关问题 m个开关控制n个灯,开始灯全灭,问到达目标状态有几种方法(每个开关至多一次操作,不 ...
- FreeModbus undefined reference to `pthread_create'
/********************************************************************************* * FreeModbus unde ...
- Ubuntu中敲写c语言步骤
1.进入Ubuntu界面 1.1按快捷键 Ctrl + Alt + T: 1.2 安装vim:输入 sudo apt-get install vim: 1.3 安装gcc:输入 sudo apt-ge ...
- Ubuntu终端及VI 快捷键
Ubuntu终端 快捷键 功能 Tab 自动补全 Ctrl+a 光标移动到开始位置 Ctrl+e 光标移动到最末尾 Ctrl+k 删除此处至末尾的所有内容 Ctrl+u 删除此处至开始的所有内容 Ct ...
- 不要使用 Dispatcher.Invoke,因为它可能在你的延迟初始化 Lazy 中导致死锁
WPF 中为了 UI 的跨线程访问,提供了 Dispatcher 线程模型.其 Invoke 方法,无论在哪个线程调用,都可以让传入的方法回到 UI 线程. 然而,如果你在 Lazy 上下文中使用了 ...
- MySQL的innoDB锁机制以及死锁处理
MySQL的nnoDB锁机制 InnoDB与MyISAM的最大不同有两点:一是支持事务(TRANSACTION):二是采用了行级锁.行级锁与表级锁本来就有许多不同之处,innodb正常的select ...
- dbt 基本试用
dbt 是一个很不错的进行etl 中的t 处理的工具,灵活简单,我们需要写的就是select 语句 dbt 帮助我们进行处理 测试集成了graphql 以及使用docker 运行 安装 pip ins ...
- 【转】每天一个linux命令(17):whereis 命令
原文网址:http://www.cnblogs.com/peida/archive/2012/11/09/2761928.html whereis命令只能用于程序名的搜索,而且只搜索二进制文件(参数- ...
- WPF ListView 简单的拖拽实现(转)
首先设置ListView的AllowDrop=True:SelectionMode=Extended;并且ListView视图为GridVIew. private void listView1_Mou ...